2023年8月27日 星期日

發現很好的SC sniplets 參考網站 https://asdw.de/en/category/scriptcase-sniplets-en/

https://asdw.de/en/category/scriptcase-sniplets-en/


今天紀錄一篇:

一、如何將[儲存]按鈕,複製一個放在 FORM 的任何位置。

https://asdw.de/en/add-new-save-button-anywhere-on-scriptcase-form/

1. 建立一個 Label 的新欄位{save_it},然後將他放在自己希望的位置。

2. 在 OnLoad Event 中,寫上下面這段程式碼:

{save_it} = '<a href="javascript: nm_atualiza (\'alterar\');" id="sc_b_upd_t" onclick="nm_atualiza (\'alterar\');; return false;" class="scButton_default" title="Update record" style="vertical-align: middle; display:inline-block;">Click to save</a>';


這樣就好了。


二、Place Button at any place of Scriptcase Form / Grid

https://asdw.de/en/place-button-at-any-place-of-scriptcase-form-grid/
要在FORM/GRID 的上面、下面 TOOLBAR 的位置,建立一個按鈕,是很簡單的事情。
但有時候,我們會希望將按鈕放在 FORM 裡面 / GRID的 ROW 裡面。
怎麼做?

1. 建立一個 動作的 LINK(如果點擊這個按鈕)

最簡單的方法是,用 SC 的 Macro:

sc_make_link(Application, Parameters)

example:

$string_link = sc_make_link(grid_images, ref_object_type='contact';ref_object_id={id});


2. 建立一個 Label 欄位

例如:名稱為: {edit_picture}

3. 在 OnLoad Event 中設定值給該欄位:

{edit_pictures} = '<a href="' . $string_link . '" class="scButton_small" title="Edit the picture" style="vertical-align: middle; display:inline-block;">' . {lang_contact_edit_pictures} . '</a>';


三、Save the data of a Scriptcase form via Ajax Event or PHP

https://asdw.de/en/save-the-data-of-a-scriptcase-form-via-ajax-event-or-php/


有時候,需要儲存紀錄,而不要讓用戶去按儲存或加入等按鈕。怎麼辦?

1. 建立一個小小的 Javascript Method 在 SC 的FORM:

Programming > Javascript Methods > New Method

The name of that method in our sample is:  ‘speichere’

The code of the method is only one line:

nm_atualiza ('alterar');


2. 設定使用者執行儲存的情境,例如用戶離開某一個欄位:

To save the content use the Ajax-event OnBlur or OnChange.

Sample: Save the data of the form when the user exits the field CityName:

在該AJAX EVENT 的定義中,使用這個程式碼:

sc_ajax_javascript('speochere', array());

這是 SC 的 macro,在 PHP 程式中呼叫 Javascript 的 method ,來儲存資料。

(我正在傷腦筋,如何在 Dashboard 中,一個 左邊的 Widget 執行程式完畢,然後呼叫讓右邊的 Widget 自動 reload,這個好像可以用。試試

哇!sc_ajax_javascript()只用在 FORM/CONTROL/CALANDAR,我的是 GRID!!不能用!哀!)



2023年8月20日 星期日

程式撰寫編碼,以可讀性為最高優先,一些較少用、非直觀的語法,盡量不要用,以PHP的 AND/&&、OR/|| 為例

PHP 的 邏輯運算元:AND/&&、OR/|| 這是常使用的運算元

而,AND 與 && 都是 AND 運算,有差別嗎?

有,其運算的優先次序不同。

&& 的運算次序高於 = , = 高於 AND

OR 一樣。

為了便於可讀性,我們建議一律使用可讀性高的表示法

如果有多個運算元在一起的運算式,就使用()來明確的表示優先次序,不要使用 && 這類不容易閱讀的運算元。


2023年8月18日 星期五

SC 的 sc_include_library()、sc_url_library() MACRO

SC 做好一些現成的 Macros 可以使用。其中:

sc_include_library("Target", "Library Name", "File", "include_once", "Require")

This macro includes a PHP file from a library in the application. You must have a library created in Scriptcase to make use of this macro. To create a library, go to "Tools -> Libraries".

Parameter
Description
TargetTells you what the scope of the library. It can be "sys" for libraries of Public scope or "prj" for libraries of the Project scope.
Library NameName given to the library at the time of creation.
FileThe absolute path within the library.
include_once (optional)Make sure that the file will only be included once. If not informed, this value is set as "true".
Require (optional)If the file or library does not exist, the application to be executed and returns an error. If not informed, the value is set as "true".

 

 

Ex: Including a file from a library:
sc_include_library("prj", "phpqrcode", "qrlib.php", true, true);



這是 External Library。
剛才試了 自己建 treeview 這個 Library,
裡面有一個 .css、一個 .js、 一個 .php、還有一個 images/tree/... 裡面的一個些圖檔

在 css 中,會用到這些圖檔,如下:
ul#n_0 {
padding-left: 0px !important;
background-image: url(images/tree/blank.gif) !important;
}

注意,那個 url(images/tree/blank.gif) 的 相對位址 images ,就直接在 Library 裡面建立 images/tree/ 的資料夾放置那些圖檔。

在SC 程式中要引用的時候,用法:

<link rel="stylesheet" type="text/css" href="<?php echo sc_url_library('prj', 'treeview', 'treeview.css'); ?>">
<script type="text/javascript" src="<?php echo sc_url_library('prj', 'treeview', 'tree.js'); ?>"></script>

這樣用。

另外,還有一個:

sc_include_library("prj", "treeview", "treeview_m.class.php", true, true);

我使用smarty 也是用這個:

// SMARTY

// Start output buffering
ob_start();
// run code in x.php file
// ...
// echo "<html><hrad></head><body>hello world!</body></html>";

sc_include_library("sys", "smarty", "Smarty.class.php", true, true);
// NOTE: Smarty has a capital 'S'
// require_once('Smarty.class.php');
$smarty = new Smarty();

$v_66shop_link = get_66shop_link_url("guest");

$smarty->assign('v_66shop_link_url',$v_66shop_link);

//** un-comment the following line to show the debug console
//$smarty->debugging = true;

$smarty->display('../_Designs/hongfu/index.html');
//echo $smarty->fetch('c:/temp/matrix_adm/html/index.html');

// saving captured output to file
// file_put_contents('c:/temp/filename.htm', ob_get_contents());
// end buffering and displaying page
ob_end_flush();

這兩個  Library 的用法,注意一下。






2023年8月15日 星期二

MySQL bit(1) 邏輯欄位 配合 View 後,竟然變了!

在資料庫表單中,經常有 Yes/No 的欄位,例如:是否已經繳款?是否審核通過?等。
原本,按理說,這樣的邏輯是否資料值的欄位,只要用 bit(1) 就足夠了。所以,我原本也就是用 bit(1) 來記錄就可以了。

結果在昨天設計SC時,由於需要使用到 VIEW,也就是SC是透過VIEW的方式來建立 GRID,(這另外說),結果 bit(1) 欄位值在 VIEW 的後面,都變成 True !連 False 也變成 True!造成程式跑出來當然就錯了!這不算是 SC的坑,但是 MySQL + VIEW 的坑了!我只好將 bit(1),改成 tinyint(1) 來記錄 0/1,這樣修改資料表結構以後,程式就完全正常了!

在這裡紀錄一下,一個小坑!

2023年8月13日 星期日

SC的坑們!這裡蒐集SC的坑!.......GRID GRID/Summary 模組,EXPORT PDF無法產生 Summary

使用工具,總是會有一些坑!

碰到了坑,就只好想辦法轉彎、變通!

沒辦法,因為是使用別人設計的工具,而且SC是有名的反應慢!反應一個BUG,可能不會收到回應,沒有信息;縱使有回應,也要等個幾個月,才有改!上次,我反應的問題,就等了快一年吧!這也是我一直會遲疑使用SC的原因之一!但也不能總是在等,應該用他來賺錢了!所以,想好合約書上的條款,規避可能的坑!

今天就出現坑了!

要產生獎金報表的程式,GRID是獎金明細,而SUMMARY模組可以產生個別總和的總結報表,這是一個非常棒的功能,在螢幕上產生的結果都很好,輸出要到 PDF、PRINT,也正確!(在我的LOCAL 開發環境上正常)!

坑要來了!

佈署到服務主機以後,輸出 SUMMARY 的 PDF,就出問題了!應該是產生 SUMMARY,但卻輸出了明細內容!試了設定的幾種排列組合!都失敗!

最後,嘗試這樣:複製出一個新的APPLICATION,而只有 SUMMARY模組,然後輸出PDF看看,因為內容只有SUMMARY,還好,好哩家在!終於在服務主機上看到期待的結果!

所以,只好這樣來避開坑了:

1. 設計兩個GRID APP,一個只有 SUMMARY、一個只有 GRID DETAIL,然後,各自產生各自的輸出 PDF,

2. 在這兩個 APP 彼此之間,再另行設計一個切換的按鈕,相互切換,看起來就好像是同一支程式APP一樣!唉!其實是為了避開無法正確產生SUMMARY PDF的坑而這樣做的!

坑!搞了好久!記錄下來,供以後使用!



另一個坑!紀錄:

年月輸入表單(APP A),呼叫 子程式總結列表(APP S),然後在 APP S 裡,做一個按鈕連結到 明細列表子程式 APP D。

如果在 APP D,也做一個連結按鈕 連結到 總結列表子程式(APP S),在開發環境中測試是可以正常運作的,但是一佈署到服務主機上,就不行了!產生"無效的數據"的錯誤訊息,這個訊息是跟權限有關的!不知道為何會這樣!只好把 APP D上連到 APPS 的連結拿掉,然後修改 APP D的 退回按鈕,退回到 APP S,這樣就解決了!

這個在開發環境上跑可以,而佈署到服務主機上就掛了!這種坑!SC好像還不少喔!

在此紀錄一下!


再一個小坑: (2023/08/14)

產生GRID總結報表(單獨的 SUMMARY 模組),結果HEADR右上角的日期格式是:dd/mm/YYYY,跟我PROJECT設定的Locale 格式不一樣,這又是一個SC的不一致的地方!算一個小坑吧!正常的 GRID 模組都正確,目前看到就這個錯誤!只好自己在 HEADER 設定那裏的 DATE,改為 VALUE,然後自己在 EVENT onScriptInit 裡寫一段: [sys_date] = date("Y/m/d");然後在 APPLICATION 的 Global Value 中將 sys_date 設為 output,這樣就完成了!規避一個小坑!

在此紀錄一下。



==============

今天(2023/09/13) 有另一個坑,也搞了好久,終於解決了!

我將過去跑得順利的 sc_samples8 本來是要安裝在 VPS上面,可是一直解壓縮有問題,所以,見乾脆回來DEDICATE 主機這裡。以前有安裝,而且跑得順利,想說在安裝回去,應該很快!

結果,samples 一安裝完畢以後,一跑就 500 Internal Error,給你當了!

有些APPLICATION可以跑,有些無法跑!很奇怪。

我原本一直在 SERVER 主機的設定上去傷腦筋!extension? php.ini? .htaccess?試了很久,還是一樣!

搞到晚上了,查YOUTUBE視頻,有一個說明 Internal Error 500 怎麼處理?

1. 找 PHP 的 error LOG

2. 修改 php.ini 的 error display 為 On

然後,就看到 Error Message了!

竟然是 php 程式錯誤!

我在 Local 上跑得很正常呀!

查了一下,就是 php 8.1 版本不再支援的舊寫法

Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/ddnews/domains/samples.alfredlin015.com/public_html/samples/new_data_entry/new_data_entry_apl.php on line 8060

再比對一下程式,samples 是 SC 公司做的,它裡面有了 internal library scwebsite.php 有改寫,所有就copy samples9 的版本到我整理用的 samples8 去,再重新  Generate、deployee ,就成功了!

唉!浪費了一整天的時間再解決這個問題,終於解決了!

紀錄一下!


====================

2023/10/23 周一

今天又一個坑!還無法解決!

合會出現的會員手機畫面,希望能窄一點

於是企圖修改 theme template

結果改了半天,都不能修改

改了 padding 為 0px 儲存以後,還是一樣!

真是夠了!

唉!

一個大坑!

-----------------------

解決方案:

----------------------

最後,只好,用右鍵點出檢查,查閱SC產生的 class/id 相對的CSS檔案,然後去copy出來,貼到onScriptInit Event 去進行修改,在這裡去蓋掉.ccs檔案的設定。

這一招,前面用過,目前也只能先這樣了!

在 WordPress 的 Theme 裡,也是有自訂 CSS 裡面,用這招來蓋掉WP所設定好的CSS!






2023年8月8日 星期二

ScriptCase Grid 的 Quick Search

在 ScriptCase 的 GRID 中,使用 Qucik Search 是很簡單,又直觀的一種 Search 功能,
但是今天發現,如果 Field 是單純的 欄位,沒有 Lookup 的選項設定在上面,那麼要搜尋結果都可以運作得正常,而一旦設為 LookUp 設定以後,就無法正常搜尋了!

剛才實際測試了一下,確實是如此的。

這是一個坑!
紀錄一下。

2023年8月6日 星期日

SC FORM Application如果只有一筆資料,且 Toolbar沒有 navigation,就沒有資料顯示!

這個倒是很奇怪的現象!

如果 FORM 的 TOOLBAR 沒有 Navigation (上一頁、下一頁等),就沒有紀錄顯示!

這個要查一查?真的是這樣嗎?

2023年8月5日 星期六

SC Security 的 LOGIN - sec_logged.php 開 modal 視窗的問題

原本 SC 所附的 Security 模組裡面的 sc_logged.php 的程式裡面,如果沒有正常登出,再度登入時,會出現沒有登出,是否要登出的警告畫面,這個畫面的程式,就是 sc_logged ,是在 Login裡面的 internal library 裡面的 sc_logged.php 函數庫裡面的第一個函數裡:

  3|     function sc_logged($user, $ip = '')
  4|     {
  5|         $str_sql = "SELECT date_login, ip FROM acc_logged WHERE login = ". sc_sql_injection($user) ." AND sc_session <> ".sc_sql_injection('_SC_FAIL_SC_');
  6|
  7|         sc_select(data, $str_sql);
  8|
  9|     if({data} === FALSE || !isset($data->fields[0]))
 10|         {
 11|             $ip = ($ip == '') ? $_SERVER['REMOTE_ADDR'] : $ip;
 12|             sc_logged_in($user, $ip);
 13|             return true;
 14|         }
 15|         else
 16|         {
 17|             sc_reset_apl_conf("acc_sec_logged");
 18|             sc_apl_status("acc_sec_logged", 'on');
 19|             sc_redir("acc_sec_logged", user=$user, 'modal',"F",300,300);
 20|             return false;
 21|         }
 22|     }

這行,原本是只有
sc_redir("acc_sec_logged", user=$user,'modal');

這樣開出來的 視窗,如果是大螢幕,還好,但,如果是手機小螢幕,就超過螢幕看不到了。
所以,我將 長寬 增加設定為: 300(heught), 300(width)
中間那個 "F",不要漏了!
意思,看SC 的 手冊 HELP

以上。

SC 的 LANGUAGE設定發布到Server時,在第二個選項中

 如果有修改了  Language,要重新發布要 Server 上去,發布時的選項,要加上第二個 Common Files。

第一個 Production 裡沒有這個 Language

以上。

SC 的 應用程式連結,資料庫主關鍵的欺騙技巧

今天在做SC應用程式時,發生一個狀況

做一個GRID Application,其中的一個契約單號欄位,希望他能夠建立一個連結關連到該契約單號的編輯表單應用程式(FORM APPLICATION)。該 FORM Application 的主關鍵欄位為 id 內碼,而我有另外建一個ext_id,是給用戶看的外部單號,那也是唯一的關鍵欄位。當使用 GRID Application 建立 連結時,SC 是自動抓取被連結的 PK,或是 有 SQL WHERE 裡面的 [v_parameter]Global Variable。因為,我那個契約單的PK是 id,不是 ext_id,但是我在 GRID 上顯示且要連結的是 ext_id,所以,建立起來時,SC會自動抓取 id,而不是 ext_id,因此就會連結不上!我必須要到契約單的 FORM 去把 PK改成 ext_id,然後,再重新在 GRID 跑一次 建立 連結,這樣SC就會抓 ext_id,而成功的建立了連結。

我原本想,這樣就完美了。

所以,契約單這邊的 FORM就繼續保留 ext_id為PK。

但是,後來,因為這個 ext_id,是我另外寫程式自動產生流水號的編碼,所以在 INSERT 時會是空白的,這樣的程式,在原本是 id 內碼為PK的情形下,都沒有問題,跑得很順利,沒有錯誤。但因為設 ext_id 為PK,結果就一直跑出 該單號 不能為 空白的錯誤,我一直嘗試把自動給值的程式加在 EVENT onValidate/ onBeforeInsert 等看能否在SC檢查PK不能為空白之前就餵給他值,這樣就可以解決!但,都失敗了!SC還是一直給我錯誤:該PK欄位不能為空白!試了很多不同的途徑,還是都無法繞過SC的檢查!最後,還是把PK 還給 id,這樣FORM本身所有的問題都沒問題了!

但是,前面,因為為了給 GRID Application 建立外部連結而關連到這支 FORM的連結,而還抓得到嗎?結果,一試!GRID 的連結,還是跑得很正常,因為他是抓 ext_id!

換句話說:以後,我可以用這個方式,來避開SC的建立連結的限制。

也就是,像今天這樣意外的經驗:

1. 原本 契約單的 FORM 的 PK是內碼 id,可以暫時 修改為 要被 GRID 建立外部連結的程式要去抓取的 ext_id (他也必須是唯一的ALT KEY),這樣讓 GRID 連結程式可以抓得到,然後自動產生。

2. 建好以後,再去 FORM 的 PK,還原為原本的 內碼 id,這樣原本設計好的 FORM 也沒有改變!只是還原而已,馬照跑舞照跳,一切跟過去一樣!

這樣就好像是暫時欺騙一下SC的GRID建立連結的程式,讓他得以建立起連結,然後再改回來!

SC GRID的建立連結要抓取PK的設計,那也是要保證程式的邏輯抓取到是唯一的正確性而這樣設計。SC只設計了 PK,還有在 SQL WHERE 裡面的 Global Variable,兩種,他還沒有設計還可以自動抓 其他也是唯一的ALT KEY的選項,那我們只好這樣先騙騙他,然後再去改回來就好了!

以上記錄一下。


2023年8月3日 星期四

SC 呼叫 sc_redir()

 sc_redir()這個函數,用來將程式導向另一個應用程式

sc_redir( )語法:

sc_redir(Application, Parameter01; Parameter02; Target, Error, height_modal, width_modal)


舉例:

sc_redir(grid_bi_bonus_rec_accountant_yymm_report,v_yymm={yymm});

sc_redir("grid_bi_bonus_rec_accountant_yymm_report",v_yymm={yymm});

經過實際測試,上面這兩者都可以。

第一個參數: application_name,可以加引號,也可以不加引號!Scriptcase 的一些參數是否加引號的規則,有時很奇怪!不大統一!總是要讓人去測試摸索一下,才能確定!

第二個以後的參數,是傳給導向的 Application 的參數,上例: v_yymm={yymm}

注意語法,這裡不能加引號。還有 v_yymm 是一個跨應用程式的 通用變數(Global Variable),SC使用時,通常是要加 "[]" 中括號,但是這裡不能加中括號,加了會產生不可預期的錯誤!我剛才搞了好久!原來是不能加中括號。而導向到被導向的 Application 時,要被使用,就要加中括號了,這是一般SC的標準用法!

結論:SC的 Macro 函數,在使用這些參數上,是否加引號,不大一致,有些可以,有些不可以,不大一致,這有點頭大,等於是要把他的HELP 範例中看清楚,才能正確使用!

這點不大好!

SC 如果發生"數據無效"之類的錯誤訊息,如何處理?

在自己LOCAL開發環境中,執行很正常,可是一上傳發布到SERVER上跑,就出現 "數據無效"的錯誤信息。經過了解,可能是 安全 Security 方面的問題。

解決方法:

從新 上傳 開啟 LOGIN 以及 跟 Security 相關的設定檢查好,我這次連 _lib 執行環境都重新上傳發布,才解決了問題!

紀錄一下。

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。