簡體   English   中英

IBM i(iSeries)觀點腳本

[英]IBM i (iSeries) View Point Script

我試圖將當前存儲在ViewPoint中的內容作為運行的腳本,並將其轉換為SQL和計划任務。 我的問題很簡單,就是我不知道用於I系列的腳本語言。 誰能告訴我&STARTS&STARTS2和&STARTS3的最終價值是什么

CHGVAR VAR(&OFFSET) VALUE(0)
CHGVAR VAR(&STARTS) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 1) Month)||'/22/'||YEAR(Current Date-(&OFFSET+1) month))))
CHGVAR VAR(&STARTS2) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 2) Month)||'/22/'||YEAR(Current Date-(&OFFSET+2) month))))
CHGVAR VAR(&STARTS3) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 3) Month)||'/22/'||YEAR(Current Date-(&OFFSET+3) month))))

關於iSeries的一個比較漂亮的事情是,它可以讓您進行“自然語言”日期數學計算: current_date - 2 months聽起來確實像是current_date - 2 months ,而這個日期恰好是今天的兩個月。

因此,假設它實際上按書面形式工作,那么此腳本的作用是:

  • 將變量&OFFSET設置為0。( CHGVAR命令是iSeries分配值的冗長方式:在大多數語言中,您將編寫&OFFSET = 0來代替,即使使用iSeries,您也​​可以將其縮短為CHGVAR &OFFSET 0
  • 將變量&STARTS設置為上個月的22日,其中日期采用CYYMMDD格式。 (它的實現方式是根據“使用今天前一個月的月份,今天為22,以及今天前一個月的月份的年份”構造日期,然后將其轉換為CYYMMDD格式。
  • 將變量&STARTS2設置為2個月前的22日
  • 將變量&STARTS3設置為3個月前的22日

如果要調整&OFFSET的值(通過更改其VALUE(0)分配),則您計算的日期將比過去更遠:將其設置為VALUE(4)將為您提供5、6和7的日期幾個月前。

順便說一下,在CYYMMDD格式中,“ C”自1900年以來就是一個世紀的計數器。 因此,日期本質上是格式為YYYYMMDD-19000000的整數。因此,1/1/1999 = 19990101(采用YYYYMMDD格式)或0990101(采用CYYMMDD格式); 2011年12月31日= 20111231為YYYYMMDD格式,或1112331為CYYMMDD格式。

因此,如果您今天(2015年8月19日)執行此操作,則應獲得以下結果:

  • &STARTS = 1150722
  • &STARTS2 = 1150622
  • &STARTS3 = 1150522

順便說一句,腳本的編寫語言稱為“ CL”(“命令語言”的簡稱),官方語言參考位於IBM知識中心

誰能告訴我&STARTS&STARTS2和&STARTS3的最終價值是什么

TL; DR:由於只有第一個CHGVAR命令可以編譯,因此所得的值將是不確定的。 其他有很多問題。 作為偽代碼,這些語句還可以,但是當表達為實際的CL語句時,它們將擴展為大量代碼。

細節:

一個潛在的問題是將CL視為一種“腳本語言”。 雖然肯定可以並且通常將其用於“腳本”,但它是系統的“控制語言”。 就“腳本”而言,對於一個體面的C程序員來說,用C替換CL就像“腳本”語言一樣簡單。 同樣,我見過RPG開發人員,他們在RPG中做很多/大部分的“腳本”工作。 對於COBOL同樣如此。

CL也是系統的“命令語言”。 在當前受支持的操作系統版本中,預計可以找到將近2000條命令。 許多系統功能只能通過命令或通過調用或調用執行該命令的程序來完成。 通過將命令字符串傳遞到系統的命令處理API之一,每種本地語言都可以交互地執行大多數命令。 即使是已編譯的語言CL,也可以像其他語言一樣交互式地執行命令。

不過,CL已編譯。 它也可以作為ILE語言完全參與,尤其是從V5R4版本的OS開始,但是從I / O在AS / 400系列中首次引入以來,從技術上講,它是可以的。

作為ILE參與者,CL可以完全訪問其他母語所具有的相同功能。 例如,CL可以使用C運行時函數庫。 因此,除了本機CL命令功能外,它基本上可以執行ILE RPG可以執行的任何操作。 您甚至可以編譯CL * MODULE並將它們綁定在一起以創建服務程序(請考慮Windows .DLL或UNIX函數庫)。

但是CL沒有的一件事是SQL預處理器。

雖然有幾個用於執行交互式SQL語句的命令,但沒有進行VALUES INTO或從游標進行抓取或從SQL函數(如DATE())獲取結果的功能。

好。 從技術上講,我想我們可以說可以做到,因為畢竟它是“ ILE CL”。 因此,CL可以調用各種SQL CLI API(例如ODBC)。 因此,您可以使用對SQLAllocEnv(),SQLAllocConnect(),SQLConnect(),SQLPrepare()和所有其他可能需要的函數的調用來編程CL過程。

但是您在CL中無法執行的操作與您在最后三個CHGVAR命令的VALUE()參數中執行的操作類似。 您當然可以對CL過程進行編碼,以執行日期計算和操作。 像其他早期一樣,在可以輕松訪問各種日期/時間API之前,我用CL(以及其他語言)編寫了各種詳細的日期數學函數。 然后,使用API​​,大多數都被更優雅的API所取代。

可以說CL是系統上最復雜的語言。 但是它不執行SQL。 至少不像C,RPG或COBOL可以。 CL旨在用作“控制”語言,而不是數據庫或應用程序語言。

不過,還有另一種選擇。 有一種本地的“腳本”語言可以運行SQL-REXX。 使用REXX進行此操作要比CL容易得多。 您的VALUE()子句幾乎可以被提升並直接粘貼到適當的REXX過程中。 您可能有一個CL包裝器來為每個復雜的VALUE()參數調用該過程並將結果從REXX中拉回。 或者,您可以讓REXX一次完成所有這三個操作。

但是,如果您希望CL做到這一切,那么還有很多代碼需要完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM