Calculation of the number of microseconds in Ada - real-time
in C langage we have get_usec() which gives us the number of microseconds since the start of the current second.
-Speaking of the "current second" necessarily refers to time reference which is often EpochTime.
-In Ada.Calendar package, I see Seconds or Clocks functions by example with ability to split & get the seconds.
But how to get the number of microseconds since the start of the current second, please?
Thanks
Mark
Note that Ada.Calendar is for local time, and may jump backwards. If it's available (are there any post-83 compilers that don't provide it?), you'll be better off using Ada.Real_Time ARM D.8:
Now : constant Ada.Real_Time.Time := Ada.Real_Time.Clock;
Count : Ada.Real_Time.Seconds_Count;
Sub : Ada.Real_Time.Time_Span;
...
Ada.Real_Time.Split (T => Now, SC => Count, TS => Sub);
Now Count contains the number of whole seconds since the epoch and Sub contains the fraction of a second in addition to Count. Ada.Real_Time.To_Duration converts a Time_Span to Duration, allowing you to multiply it by 1E6 to get microseconds.
The packages Ada.Calendar and Ada.Calendar.Formatting provide the information you will need.
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Calendar; use Ada.Calendar;
with Ada.Calendar.Formatting; use Ada.Calendar.Formatting;
procedure Main is
Now : Time := Clock;
Seconds : Second_Duration := Sub_Second (Now);
begin
Put_Line
("Sub seconds since current second: " &
Second_Duration'Image (Seconds));
end Main;
The output of one execution of this program is:
Sub seconds since current second: 0.655316600
In this execution the value indicated 655316.6 microseconds.
It can also be done (of course) without Ada.Calendar.Formatting, like this for example:
with Ada.Calendar; use Ada.Calendar;
...
type Seconds_In_Day is range 0 .. 86_400;
-- Or use Integer if it is 32 bits.
Now : constant Day_Duration := Seconds (Clock);
Subsec : Duration := Now - Day_Duration (Seconds_In_Day (Now));
...
if Subsec < 0.0 then
-- Conversion of Now rounded up instead of down.
Subsec := Subsec + 1.0;
end if;
with the result in Subsec.
But using Ada.Calendar.Formatting.Sub_Second is shorter, and may be better (faster or more accurate) for all I know; I did not compare the two methods.
Many thaks for yours answers.
Using all yours examples, i made some trials, one is below :
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Calendar; use Ada.Calendar;
with Ada.Real_Time; use Ada.Real_Time;
procedure Display_Current_Year is
--need to precise the origin package Ada.Real-Time else ambiguous
Now : Ada.Calendar.Time := Clock;
Now_Year : Year_Number;
Now_Month : Month_Number;
Now_Day : Day_Number;
Now_Seconds : Day_Duration;
Current_Real_Time : Ada.Real_Time.Time;
Time_Span : Ada.Real_Time.Time_Span;
Seconds_Count : Ada.Real_Time.Seconds_Count;
Hour : float;
begin
--- Ada.Calendar
Split (Now,
Now_Year,
Now_Month,
Now_Day,
Now_Seconds);
Put_Line("Calendar : Date du jour = ");
Put_Line ("Current year is: "
& Year_Number'Image (Now_Year));
Put_Line ("Current month is: "
& Month_Number'Image (Now_Month));
Put_Line ("Current day is: "
& Day_Number'Image (Now_Day));
Put_Line ("'Current' seconde is: "
& Day_Duration'Image (Now_Seconds));
New_Line;
--Ada.Real_Time;
Current_Real_Time := Ada.Real_Time.Clock;
Ada.Real_Time.Split (T => Current_Real_Time,
Sc => Seconds_Count,
Ts => Time_Span);
Put_Line ("Real_Time : Seconds_Count = " & Seconds_Count'Img);
Hour := (float(Seconds_count) / 3600.00);
Put_Line ("Hour since seconds origin : "
& (Hour'Img));
end Display_Current_Year;
with result :
$ ./display_current_year
Calendar : Date du jour =
Current year is: 2022
Current month is: 2
Current day is: 27
'Current' seconde is: 68625.325897000
Real_Time : Seconds_Count = 30953
Hour since seconds origin : 8.59806E+00
$
-Results for calendar are OK, but why 30953 seconds !!
Where does GNAT take the Epoch, if this is, in this case, please?
Thanks
Mark
You can do a dirty trick where you define a record My_raw_duration_Type : whole_part, fraction_part, both U32. Define Unchecked_Conversion To_Raw (Ada.Real_Time.Duration, My_Raw_Duration_Type). Then take the result of that and call it My_Raw_Duration. The milliseconds result you want is integer(float(My_Raw_Duration.Fraction_Part)/float(4*1032**2) * 1000.0);
Related
Call to nonexistent function AHKv2
I am trying to create a simple InputBox pop-up that asks for an hour:minute combo, and then starts a countdown timer. When the timer reaches zero, it activates a window and then sends input into that window. I have followed the documentation and am still met with the same error over and over Call to nonexistent function. My script used to be far more complicated, but in an effort to troubleshoot, it has gotten progressively simpler and simpler ... and now it basically mirrors the documentation -- and yet, I still get this error. Fresh eyes on this would be greatly appreciated! :*:obstimer:: ;; Show the input box USER_INPUT := InputBox("This is the prompt","This is the title",W200 H300 T30,"").value ;; Split the input time into hours and minutes TimeArray := StrSplit(USER_INPUT, ":") hours := TimeArray[1] ; Get the hours part minutes := TimeArray[2] ; Get the minutes part ;; Convert the hours and minutes to seconds loop_timer = (hours * 3600) + (minutes * 60) ;; Set a timer that will trigger the press_backtick function every 1000 milliseconds (1 second) SetTimer, press_backtick, 1000 return press_backtick: loop_timer-- ; Decrement the loop timer by 1 if (loop_timer <= 0) { ; If the loop timer is less than or equal to 0 WinActivate, ahk_exe obs64.exe ; Activate the obs64.exe window ControlSend, , {U+0060}, ahk_exe obs64.exe ; Send the backtick character ` to the obs64.exe window SetTimer, press_backtick, off ; Turn off the timer } return
Your syntax is so far from being valid AHKv2 syntax, that the AHK script launcher deduces your script as being AHKv1, and therefore you get the error for a non existent function. (A function InputBox doesn't exist in AHKv1, it's a legacy command there) Here's the script in AHKv2 syntax, there are loads of changes, and you also had some errors which wouldn't have worked even in v1. I'd recommend you to go through v2 changes before trying to write v2 code (assuming you have a v1 background). Or if this is your first time writing AHK, be sure to look at v2 examples and documentations. :*:obstimer:: { global loop_timer USER_INPUT := InputBox("This is the prompt", "This is the title", "W200 H300 T30", "").value TimeArray := StrSplit(USER_INPUT, ":") hours := TimeArray[1] minutes := TimeArray[2] loop_timer := (hours * 3600) + (minutes * 60) SetTimer(press_backtick, 1000) } press_backtick() { global loop_timer loop_timer-- ; Decrement the loop timer by 1 if (loop_timer <= 0) { WinActivate("ahk_exe obs64.exe") ControlSend("{U+0060}", , "ahk_exe obs64.exe") SetTimer(press_backtick, 0) } }
I2C returning Busy or Error on memory reading
I started the following code to handle a Bosch BME280 sensor with a Nucleo-F446ZE and a Nucleo-F411RE boards. with STM32.Device; use STM32.Device; with STM32.GPIO; use STM32.GPIO; with STM32; use STM32; with STM32.I2C; with HAL.I2C; use HAL.I2C; use HAL; procedure Simple_I2C_Demo is -- I2C Bus selected Selected_I2C_Port : constant access STM32.I2C.I2C_Port := I2C_1'Access; Selected_I2C_Port_AF : constant GPIO_Alternate_Function := GPIO_AF_I2C1_4; Selected_I2C_Clock_Pin : GPIO_Point renames PB8; Selected_I2C_Data_Pin : GPIO_Point renames PB9; Port : constant HAL.I2C.Any_I2C_Port := Selected_I2C_Port; -- Shift one because of 7-bit addressing I2C_Address : constant HAL.I2C.I2C_Address := 16#76# * 2; procedure SetupHardware is GPIO_Conf_AF : GPIO_Port_Configuration (Mode_AF); Selected_Clock_Speed : constant := 10_000; begin Enable_Clock (Selected_I2C_Clock_Pin); Enable_Clock (Selected_I2C_Data_Pin); Enable_Clock (Selected_I2C_Port.all); STM32.Device.Reset (Selected_I2C_Port.all); Configure_Alternate_Function (Selected_I2C_Clock_Pin, Selected_I2C_Port_AF); Configure_Alternate_Function (Selected_I2C_Data_Pin, Selected_I2C_Port_AF); GPIO_Conf_AF.AF_Speed := Speed_100MHz; GPIO_Conf_AF.AF_Output_Type := Open_Drain; GPIO_Conf_AF.Resistors := Pull_Up; Configure_IO (Selected_I2C_Clock_Pin, GPIO_Conf_AF); Configure_IO (Selected_I2C_Data_Pin, GPIO_Conf_AF); STM32.I2C.Configure (Selected_I2C_Port.all, (Clock_Speed => Selected_Clock_Speed, Addressing_Mode => STM32.I2C.Addressing_Mode_7bit, Own_Address => 16#00#, others => <>)); STM32.I2C.Set_State (Selected_I2C_Port.all, Enabled => True); end SetupHardware; ID : HAL.I2C.I2C_Data (1 .. 1); Status : HAL.I2C.I2C_Status; begin SetupHardware; HAL.I2C.Mem_Read (This => Port.all, Addr => I2C_Address, Mem_Addr => 16#D0#, Mem_Addr_Size => HAL.I2C.Memory_Size_8b, Data => ID, Status => Status, Timeout => 15000); if Status /= Ok then raise Program_Error with "I2C read error:" & Status'Img; end if; end Simple_I2C_Demo; In this simple example, I always get an error status at the end of reading. In the context of a more complete code, I always get a Busy status after waiting 15secs. I really don't see what is going on as my code is largely inspired from the code I found on Github for a I2C sensor. Maybe I forgot a specific code for I2C init but as I'm not an expert, I prefer to ask to experts :)
Finally found what was wrong. After testing with C using STM HAL and investigating the Ada configuration code, I found that a line was missing: GPIO_Conf_AF.AF_Speed := Speed_100MHz; GPIO_Conf_AF.AF_Output_Type := Open_Drain; GPIO_Conf_AF.Resistors := Pull_Up; -- Missing configuration part of the record GPIO_Conf_AF.AF := Selected_I2C_Port_AF; -- That should be present even though there was a call to configure -- each pin few lines above Configure_IO (Selected_I2C_Clock_Pin, GPIO_Conf_AF); Configure_IO (Selected_I2C_Data_Pin, GPIO_Conf_AF); Using Configure_IO after Configure_Alternate_Function crushes the configuration and, as there was a part of the record which was left uninitialized, the GPIO were incorrectly configured. To be more precise, after looking at the code inside the GPIO handling, Configure_IO calls Configure_Alternate_Function using the AF part of the GPIO_Port_Configuration record. In my case, it was resetting it. With the missing line, the code now runs correctly with Mem_Read and Master_Transmit/Master_Receive. A big thanks to ralf htp for advising me to dive into the generated C code.
No, between HAL_I2C_Mem_Read and the HAL_I2C_Master_Transmit, wait, HAL_I2C_Master_Receive procedure is only a nuance cf How do I use the STM32CUBEF4 HAL library to read out the sensor data with i2c? . If you know what size of data you want to receive you can use the HAL_I2C_Master_Transmit, wait, HAL_I2C_Master_Receive procedure. A C++ HAL I2C example is in https://letanphuc.net/2017/05/stm32f0-i2c-tutorial-7/ //Trigger Temperature measurement buffer[0]=0x00; HAL_I2C_Master_Transmit(&hi2c1,0x40<<1,buffer,1,100); HAL_Delay(20); HAL_I2C_Master_Receive(&hi2c1,0x40<<1,buffer,2,100); //buffer[0] : MSB data //buffer[1] : LSB data rawT = buffer[0]<<8 | buffer[1]; //combine 2 8-bit into 1 16bit Temperature = ((float)rawT/65536)*165.0 -40.0; //Trigger Humidity measurement buffer[0]=0x01; HAL_I2C_Master_Transmit(&hi2c1,0x40<<1,buffer,1,100); HAL_Delay(20); HAL_I2C_Master_Receive(&hi2c1,0x40<<1,buffer,2,100); //buffer[0] : MSB data //buffer[1] : LSB data rawH = buffer[0]<<8 | buffer[1]; //combine 2 8-bit into 1 16bit Humidity = ((float)rawH/65536)*100.0; HAL_Delay(100); } Note that it uses HAL_I2C_Master_Transmit, waits 20 ms until the slave puts the data on the bus and then receives it with HAL_I2C_Master_Receive. This code is working, i tested it myself. Possibly the problem is that the BME280 supports single byte reads and multi-byte reads (until it sends a NOACK and stop). HAL_I2C_Mem_Read waits for the ACK or stop but for some reasons it does not get it what causes the Busy and then Timeout behavior, cf page 33 of the datasheet http://www.embeddedadventures.com/datasheets/BME280.pdf for the multibyte read. You specified timeout to 15 sec and you get the timeout after 15 secs. So it appears that the BME280 simply does not stop sending or it sends nothing including not a NOACK and Stop condition ... HAL_I2C_Mem_Read sometimes causes problems, this depends on the slave https://community.arm.com/developer/ip-products/system/f/embedded-forum/7989/trouble-getting-values-with-i2c-using-hal_library By the way with the HAL.I2C.Mem_Read (This => Port.all, Addr => I2C_Address, Mem_Addr => 16#D0#, Mem_Addr_Size => HAL.I2C.Memory_Size_8b, Data => ID, Status => Status, Timeout => 15000); you try to read 1 byte the chip identification number from register D0 cf http://www.embeddedadventures.com/datasheets/BME280.pdf page 26
How come new_duration prints out as blank not allowing my loop to run?
I am using AutoHotKey's latest release of v1.1 I pass 3 arguments to the program from the commandline: key, duration, and window saved in %1%, %2%, and %3% respectively. When printing key duration and window using MsgBox, %1% %2% %3% I get correct values of lets say in this case a 5 Untitled duration := %2% new_duration := (duration * 1000) MsgBox, %new_duration% while (A_TickCount - start <= new_duration) { ControlSend,,{Blind}{%1% down}{Blind}{%1% up},%3% sleep 50 } When the above code is executed it prints nothing not allowing my loop to run. Why?
I read the documentation a bit more carefully and found A_Args[index] Completed code: key := A_Args[1] duration := (A_Args[2] * 1000) window := A_Args[3] while (A_TickCount - start <= duration) { ControlSend,,{Blind}{%key% down}{Blind}{%key% up},%window% sleep 50 }
How to adjust a variable via dividing it by the sum of observations in previous days?
I want to write a code to run the formula which is shown below: Adjusted volume for each name and date = IntradayVolume / ( dailyvolume for five last days) And I use codes which are shown below: *Division for calculating adjusted volume; proc sort data=sampledata_sumvolso02 out=sampledata_sumvolso02; by TRD_STCK_CD TRD_EVENT_DT; run; *Adjusted intraday volume for days of a week; data sampledata_adjvol02; do until(last.TRD_STCK_CD); do until(last.TRD_EVENT_DT); set sampledata_sumvolso02; by TRD_STCK_CD TRD_EVENT_DT; if first.TRD_STCK_CD then n=0; if first.TRD_EVENT_DT then n+1; if n>7 then do; if not missing(IntradayVolume) then adjusted_volume=divide(IntradayVolume,temp); else call missing(adjusted_volume); end; if last.TRD_EVENT_DT then temp=dailyvolume; output; end; end; drop temp n; run; Here is a sample of my data: data WORK.SAMPLEDATA_SUMVOLSO02; infile datalines dsd truncover; input TRD_STCK_CD:$15. TRD_PR:32. TRD_TUROVR:14. TRD_EVENT_DT:DATE9. TRD_EVENT_TM:TIME5. TRD_EVENT_ROUNDED:32. TRD_EVENT_ROUFOR:$5. CountedVOLUME:32. DailyVolume:32. IntradayVolume:32.; format TRD_TUROVR 14. TRD_EVENT_DT DATE9. TRD_EVENT_TM TIME5.; label TRD_STCK_CD="TRD_STCK_CD" TRD_PR="TRD_PR" TRD_TUROVR="TRD_TUROVR" TRD_EVENT_DT="TRD_EVENT_DT"; datalines4; BALI1,850,9260,24MAR2008,9:14,34200,9:30,7871000,, BALI1,850,2000,23MAR2008,9:15,34200,9:30,1700000,, BALI1,850,10000,22MAR2008,9:15,34200,9:30,8500000,, BALI1,850,6000,21MAR2008,9:15,34200,9:30,5100000,, BALI1,850,10000,20MAR2008,9:29,34200,9:30,8500000,31671000,31671000 BANK1,1164,10729,20MAR2008,9:38,36000,10:00,12488556,,12488556 BANK1,1148,2000,21MAR2008,11:24,41400,11:30,2296000,, BANK1,1147,1575,22MAR2008,11:24,41400,11:30,1806525,16591081,4102525 BHMN1,1013,1500,14MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,15MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,16MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,17MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,18MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,19MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1000,20MAR2008,9:00,34200,9:30,1013000,, BHMN1,1013,450,21MAR2008,9:00,34200,9:30,455850,, BHMN1,1013,1500,22MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,23MAR2008,9:00,34200,9:30,1519500,, BHMN1,1013,1500,24MAR2008,9:04,34200,9:30,1519500,, BHMN1,1013,1500,25MAR2008,9:04,34200,9:30,1519500,, BHMN1,1013,601,26MAR2008,9:05,34200,9:30,608813,, BHMN1,1013,697,27MAR2008,9:06,34200,9:30,706061,, BHMN1,1013,1500,28MAR2008,9:08,34200,9:30,1519500,, BHMN1,1013,1500,29MAR2008,9:08,34200,9:30,1519500,, BHMN1,1013,1500,12MAR2008,9:09,34200,9:30,1519500,, BHMN1,1013,1500,13MAR2008,9:16,34200,9:30,1519500,, BHMN1,1013,1500,14MAR2008,9:22,34200,9:30,1519500,,25576224 BHMN1,1013,1500,15MAR2008,9:41,36000,10:00,1519500,,1519500 BHMN1,1013,1500,16MAR2008,10:13,37800,10:30,1519500,, BHMN1,1013,1500,17MAR2008,10:13,37800,10:30,1519500,,3039000 BHMN1,1013,1500,18MAR2008,11:25,41400,11:30,1519500,,1519500 BHMN1,1013,1500,19MAR2008,11:51,43200,12:00,1519500,33173724,1519500 CHML1,12000,745,20MAR2008,9:00,34200,9:30,8940000,, CHML1,12000,82,21MAR2008,9:00,34200,9:30,984000,, CHML1,11998,206,22MAR2008,9:07,34200,9:30,2471588,, CHML1,11998,414,23MAR2008,9:09,34200,9:30,4967172,, CHML1,11998,348,24MAR2008,9:12,34200,9:30,4175304,, CHML1,11996,82,25MAR2008,9:15,34200,9:30,983672,, CHML1,11996,1240,26MAR2008,9:16,34200,9:30,14875040,, CHML1,11996,414,27MAR2008,9:17,34200,9:30,4966344,, CHML1,11970,1000,28MAR2008,9:21,34200,9:30,11970000,, CHML1,11964,158,29MAR2008,9:22,34200,9:30,1890312,, CHML1,11990,1946,20MAR2008,9:23,34200,9:30,23332540,,79555972 CHML1,11851,500,19MAR2008,10:42,39600,11:00,5925500,, CHML1,11852,1054,18MAR2008,10:44,39600,11:00,12492008,, CHML1,11900,2000,17MAR2008,10:56,39600,11:00,23800000,,42217508 CHML1,11913,244,16MAR2008,11:08,41400,11:30,2906772,, CHML1,11913,56,15MAR2008,11:09,41400,11:30,667128,, CHML1,11968,944,14MAR2008,11:13,41400,11:30,11297792,, CHML1,11968,2056,13MAR2008,11:27,41400,11:30,24606208,, CHML1,11987,380,14MAR2008,11:29,41400,11:30,4555060,,44032960 CHML1,11988,620,11MAR2008,11:30,43200,12:00,7432560,, CHML1,11981,1663,12MAR2008,11:52,43200,12:00,19924403,, CHML1,11981,765,24MAR2008,11:52,43200,12:00,9165465,202328868,36522428 CRBN1,1486,1700,22MAR2008,9:00,34200,9:30,2526200,, CRBN1,1485,3353,24MAR2008,9:21,34200,9:30,4979205,7505405,7505405 DADE1,1685,2972,24MAR2008,10:04,37800,10:30,5007820,,5007820 DADE1,1632,2000,20MAR2008,11:49,43200,12:00,3264000,, DADE1,1631,5000,21MAR2008,11:49,43200,12:00,8155000,, DADE1,1630,3000,22MAR2008,11:49,43200,12:00,4890000,, DADE1,1630,2000,23MAR2008,11:50,43200,12:00,3260000,, DADE1,1630,8000,24MAR2008,11:50,43200,12:00,13040000,37616820,32609000 DFRB1,7450,124,24MAR2008,10:54,39600,11:00,923800,,923800 DFRB1,7450,132,24MAR2008,11:16,41400,11:30,983400,1907200,983400 DJBR1,7491,3000,24MAR2008,10:06,37800,10:30,22473000,22473000,22473000 DRZK1,14890,72,24MAR2008,11:58,43200,12:00,1072080,1072080,1072080 FIBR1,2846,100,24MAR2008,11:17,41400,11:30,284600,284600,284600 FKAS1,3584,5173,20MAR2008,9:15,34200,9:30,18540032,, FKAS1,3584,3000,21MAR2008,9:15,34200,9:30,10752000,, FKAS1,3585,1827,22MAR2008,9:15,34200,9:30,6549795,,35841827 FKAS1,3585,183,23MAR2008,9:35,36000,10:00,656055,, FKAS1,3585,3200,24MAR2008,9:35,36000,10:00,11472000,,12128055 FKAS1,3539,2000,25MAR2008,11:02,41400,11:30,7078000,, FKAS1,3538,8000,26MAR2008,11:02,41400,11:30,28304000,, FKAS1,3538,2000,27MAR2008,11:02,41400,11:30,7076000,, FKAS1,3537,8000,28MAR2008,11:02,41400,11:30,28296000,, FKAS1,3537,2000,29MAR2008,11:02,41400,11:30,7074000,, FKAS1,3535,8000,20MAR2008,11:02,41400,11:30,28280000,, FKAS1,3535,2000,19MAR2008,11:03,41400,11:30,7070000,, FKAS1,3535,6617,18MAR2008,11:03,41400,11:30,23391095,, FKAS1,3533,100,17MAR2008,11:03,41400,11:30,353300,, FKAS1,3533,1283,16MAR2008,11:07,41400,11:30,4532839,, FKAS1,3533,2763,15MAR2008,11:08,41400,11:30,9761679,, FKAS1,3529,10000,14MAR2008,11:15,41400,11:30,35290000,, FKAS1,3516,10000,13MAR2008,11:17,41400,11:30,35160000,, FKAS1,3516,10000,12MAR2008,11:19,41400,11:30,35160000,, FKAS1,3516,39,11MAR2008,11:19,41400,11:30,137124,, FKAS1,3515,2000,19MAR2008,11:25,41400,11:30,7030000,, FKAS1,3515,198,24MAR2008,11:25,41400,11:30,695970,, FKAS1,3515,9802,20MAR2008,11:25,41400,11:30,34454030,,299144037 FKAS1,3515,4000,21MAR2008,11:48,43200,12:00,14060000,, FKAS1,3513,6000,22MAR2008,11:52,43200,12:00,21078000,, FKAS1,3514,2000,23MAR2008,11:52,43200,12:00,7028000,, FKAS1,3514,1085,24MAR2008,11:52,43200,12:00,3812690,, FKAS1,3500,1000,25MAR2008,11:56,43200,12:00,3500000,396592609,49478690 FOLD1,3198,390,24MAR2008,9:09,34200,9:30,1247220,,1247220 FOLD1,3197,2000,27MAR2008,10:31,39600,11:00,6394000,, FOLD1,3191,2000,28MAR2008,10:32,39600,11:00,6382000,, FOLD1,3190,4000,20MAR2008,10:33,39600,11:00,12760000,, FOLD1,3190,542,18MAR2008,10:33,39600,11:00,1728980,, ;;;; Now, I want to divide Intradayvolume variable by aggregated Dailyvolume variable in a week before today. It is important to specify for SAS to diagnoses days of a week and adapts it with the date variable in my dataset. Because the format of the date variable of my dataset is ddmmyy. I mean SAS should find which days of a week are today and aggregates Dailyvolume variable of a week before today as the denominator. How can I run that formula? Thanks in advance.
I'm not sure exactly what you're doing there, but one approach might be to create a temporary array and index it with the date. Then look up in that index. You'd have some issues with that simplistic of a method with holidays and such, but it should give you at least an approximately right answer. For example (again, I don't entirely understand your variables or what you're doing, so this is an approximate idea): *Adjusted intraday volume for days of a week; data sampledata_adjvol02; array prevdat[32767] _temporary_; do until(last.TRD_STCK_CD); do until(last.TRD_EVENT_DT); set sampledata_sumvolso02; by TRD_STCK_CD TRD_EVENT_DT; if first.TRD_STCK_CD then n=0; if first.TRD_EVENT_DT then n+1; if n>7 then do; if not missing(IntradayVolume) then adjusted_volume=divide(IntradayVolume,prevdat[TRD_EVENT_DT-7]); else call missing(adjusted_volume); end; if last.TRD_EVENT_DT then temp=dailyvolume; output; prevdat[TRD_EVENT_DT] = sum(prevdat[TRD_EVENT_DT],countedVolume); end; end; call missing(of prevdat[*]); drop temp n; run;
data sampledata_adjvol (drop=cnt dv_:); set Sampledata_SumVolSo; by TRD_STCK_CD TRD_EVENT_DT; retain dv_1 dv_2 dv_3 dv_4 cnt 0 dv_sum; if first.TRD_STCK_CD then do; cnt=0; dv_1=0; dv_2=0; dv_3=0; dv_4=0; dv_sum=0; end; adjusted_volume_5=intradayvolume/dv_sum; if last.TRD_EVENT_DT then do; cnt=cnt+1; if cnt=1 then dv_4=dailyvolume; else if cnt=2 then dv_3=dailyvolume; else if cnt=3 then dv_2=dailyvolume; else if cnt=4 then dv_1=dailyvolume; else do; dv_sum=dailyvolume+dv_1+dv_2+dv_3+dv_4; dv_4=dv_3; dv_3=dv_2; dv_2=dv_1; dv_1=dailyvolume; end; end; run;
VBScript in IBM Personal Communications, Register current date and time
This is a bit complicated to explain but I sure will do my best! I want to register the current time and date "Year,Week,day + Time", in my program IBM Personal Communications (Session A). I have to use a .MAC extension for the final file in order for the program to read it. This is the code that I have at the moment: [PCOMM SCRIPT HEADER] LANGUAGE=VBSCRIPT DESCRIPTION= [PCOMM SCRIPT SOURCE] OPTION EXPLICIT autECLSession.SetConnectionByName(ThisSessionName) REM This line calls the macro subroutine subSub1_ sub subSub1_() autECLSession.autECLOIA.WaitForAppAvailable autECLSession.autECLOIA.WaitForInputReady autECLSession.autECLPS.SendKeys "151441652 " **<--This is where the date has to appear** autECLSession.autECLOIA.WaitForInputReady autECLSession.autECLPS.SendKeys "[enter]" autECLSession.autECLPS.WaitForAttrib 12,1,"00","3c",3,10000 autECLSession.autECLPS.Wait 3401 autECLSession.autECLOIA.WaitForAppAvailable autECLSession.autECLOIA.WaitForInputReady autECLSession.autECLPS.SendKeys "[pf12]" end sub autECLSession.autECLPS.SendKeys "151441652 " <--- The final values must appear here in the same order. The numbers have been entered manually by me. So what I essentially need the final program to do is to recognize the date and enter them manually. This is what the numbers stand for: 15 = The year 2015 14 = The current week, the date right now is 02-04-2015 which is Week 14 4 = Day 4 of the week. thursday 1652 = Current time, I need the time to be a 24hour clock.
DatePart() can do all of this. autECLSession.autECLPS.SendKeys _ Right(DatePart("yyyy", Now()), 2) & _ Right("0" & DatePart("ww", Now()), 2) & _ DatePart("w", Now()) & _ Right("0" & DatePart("h", Now()), 2) & _ Right("0" & DatePart("n", Now()), 2) Take note of the optional FirstDayOfWeek and FirstWeekOfYear parameters, test your edge cases and set those parameters accordingly for the relevant calls.