2022年7月27日 星期三

Scriptcase Blank/Grid 應用 Bootstrap 的 Badges (徽章)

在 Scriptcase上應用 Bootstrap:

GRID:

1. 在 Events 的 onScriptInit 裡,加上 Bootstrap 的引入連結,可以在Bootstrap 官網上,複製過來即可:

<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">



2. 在要顯示的欄位定義裡,套用Badges 的定義即可。

// Check for record
$check_sql = "SELECT count(*) "
   . " FROM orders"
   . " WHERE employeeid = " . {employeeid};
sc_lookup(rs, $check_sql);

if (isset({rs[0][0]})) { //found
    $v_orders_count = {rs[0][0]};
} else {
    $v_orders_count = 0;
}

if ( $v_orders_count > 100 ) {
	{ordcount} = "" . $v_orders_count . "";
} else {
	{ordcount} = "" . $v_orders_count . "";
}

2022年7月10日 星期日

ScriptCase 的 DashBoard Application說明

 ScriptCase 的 DashBoard Application 作為一個主控台應用程式,可以同時將數個Application 放置在同一個面板上面。

DashBoard 可以安排兩種不同的 Widget(桌面小工具):

  • Link Widget :連結到現成的APP
  • Index Widget:建立一個直接抓取資料庫資料表的資料數值。



Index Widget

  • Table Name
  • Metric Field:公制欄位
  • Period Field:與公制欄位做比較的期間欄位。(這個翻譯還要再斟酌一下。)
目前測試,好像是:設定一個要觀測的資料,例如營業額,這就是 Metric Field
而 Period Field ,好像只能是日期欄位,然後可以設定與日期有關的格式,做比較。是成長、下降等!再研究一下!

2022年6月26日 星期日

整理一下SC裡面關於SQL的指令,自寫程式時使用

整理 SC 裡面,自訂程式時,如何使用 SC提供的SQL指令


一、關於 connection:

1. 使用SC Project 設定現成的 Connection

2. sc_connection_edit("Connetion_Name", $arr_conn)

1º Parameter: Connection name to be edited.

2º Parameter: Array of items containing the connection information to be edited. Check out the indices of the array:

Indice
DescriptionExample
['server']Database server (host)$arr_conn['server'] = "127.0.0.1"
['user']Database username$arr_conn['user'] = "root"
['password']Database password$arr_conn['password'] = "secretpass123"
['database']Database name used in the connection$arr_conn['database'] = "sc_samples"
['persistent']Defines if the connection is persistent or not$arr_conn['persistent'] = "Y" / "N"
['encoding']Configure the connection encoding$arr_conn['encoding'] = "utf8"

Note:Is not required to use all the indices in the array, we can pass only the required ones.

Example:

$arr_conn = array();

$arr_conn['user'] = "admin2";
$arr_conn['password'] = "admin2pass";
$arr_conn['database'] = "sc_samples2";

sc_connection_edit("sc_connection", $arr_conn);


3. sc_connection_new("Connection_Name", $arr_conn)

The new connection will only be available in the next application.

1º Parameter: Connection name.

Note: If there is a connection created within the Scriptcase with the same name, this macro has no effect. Connections created within the Scriptcase prevail. If you want to edit an existing connection, see the documentation for the macro sc_connection_edit.

2º Parameter: Array of items containing the connection information. Check out the indices of the array:

 

Indice
DescriptionExample
['drive']Driver of the database used for the connection (see table below)$arr_conn['drive'] = "oci8"
['server']Database server (host)$arr_conn['server'] = "127.0.0.1"
['user']Database username$arr_conn['user'] = "root"
['password']Database password$arr_conn['password'] = "secretpass123"
['database']Database name used in the connection$arr_conn['database'] = "sc_samples"
['persistent']Defines if the connection is persistent or not$arr_conn['persistent'] = "Y" / "N"
['encoding']Configure the connection encoding$arr_conn['encoding'] = "utf8"

Note: It is required that all items are filled, with the exception of items ['persistent'] and ['encoding'].


Example:

$arr_conn = array();

$arr_conn['drive'] = "mysqlt";
$arr_conn['server'] = "127.0.0.1";
$arr_conn['user'] = "root";
$arr_conn['password'] = "pass123";
$arr_conn['database'] = "sc_samples";
$arr_conn['persistent'] = "Y";
$arr_conn['encoding'] = "utf8";

sc_connection_new("new_conn_mysql", $arr_conn);


二、SQL SELECT

sc_select (dataset, "SQL Command", "Connection")

sc_lookup (Dataset, "SQL Command", "Connection")


sc_select(dataset, "SQL Command", "Connection")

This macro executes the SQL commands passed as parameter and access the "dataset" in the command.

Different from sc_lookup macro, this macro doesn't manipulate the dataset (the user is responsible for all the manipulation).

If an error occurs in the sql command execution, the variable attributed to the database returns as "false" and the error message is available in the "dataset_error" variable.

The connection parameter is optional, use only if the command is executed in a data base different from the specified in the application. In this parameter it is not possible to use variables.


Ex. 1:

sc_select(my_data, "select clientId, clientName, limitecred from costumers");
if ({my_data} === false) {
    echo "Access error. Message =". {my_data_erro};
} else {
    while (!{my_data}->EOF) {
          {clientName} = {my_data}->fields[1];
          {my_data}->MoveNext();
     }
    {my_data}->Close();
}



Ex. 2: The SQL command can passed as application fields (local variables) or of global variables.
sc_select(dataset,"select price order from order where clientId = '{clientId}' and cod_Seller = [var_glo_seller]");

Note: The command must always be finished with semicolon";".


sc_lookup(Dataset, "SQL Command", "Connection")


This macro allows the user to execute SQL commands and returns the result to the "dataset" variable. The "dataset" structure is an array (line/column).

The "connection" parameter is optional. Use when the command is executed in a database different from that specified for the application.
Note: The connection parameter does not accept variable. You must enter the name of the connection that the SQL command will execute.


Ex. 1:
sc_lookup(dataset, "select customer_id, customer_name, credit_limit from customers" );

To have access to the first line (Dataset), use :
{customer_id} = {dataset[0][0]};
{customer_name} = {dataset[0][1]};
{credit_limit } = {dataset[0][2]};

To have access to the second line (Dataset), use:
{customer_id} = {dataset[1][0]};
{customer_name} = {dataset[1][1]};
{credit_limit} = {dataset[1][2]};

If occurs error in the execution of the SQL command, the variable attributed to the dataset will return as "false" and the error message will be available in the "dataset_error" variable. It is also important to verify the select returned data, to prevent access to non-existent variables, once the output array only will be created if the select command returns data.


Ex. 2:
sc_lookup(my_data, "select customer_id, customer_name, credit_limit from customers");
if ({my_data} === false)
{
echo "Access error. Message=". {my_data_error} ;
}
elseif (empty({my_data}))
{
echo "Select command didn't return data";
}
else
{
{customer_id} = {my_data[0][0]};
{customer_name} = {my_data[0][1]};
{credit_limit} = {my_data[0][2]};
}



Ex. 3: 
The SQL command also can be composed of application fields (local variables) or of global variables:
sc_lookup(dataset, "select order_value from orders where clientid = '{customer_id} ' and salesman_id = [var_glo_salesman]");

Note: The command must always be finished with a semicolon ";".

Note2: For a big result returned in the dataset we recommend the use of the macro sc_select instead of this one.



























sc_sql_injection ({My_Field}) or ($My_Variable)

sc_sql_protect (Value, "Type", "Connection")





Wordpress 的 Table 分析

由於有想要自己用SC設計一個取代(相容) WORDPRESS 的 CMS架站系統,所以,需要研究一下 WordPress 的資料庫結構。

按照功能大致分為五類:
用戶資訊 : wp_users , wp_usermeta
鏈接資訊 : wp_links
文章及評論 : wp_posts , wp_postmeta , wp_comments
分類,鏈接分類,標籤管理 : wp_term , wp_term_relationships , wp_term_taxonomy
全局設置 : wp_options

wp_commentmeta:評論的其他資訊
wp_comments:留言回覆
wp_links:友情鏈接(Blogroll)
wp_options:儲存 WordPress 系統選項和插件、主題配置
wp_postmeta: 存儲文章(包括頁面、上傳文件、修訂)的其他資訊
wp_posts:儲存文章(包括頁面、上傳文件、修訂)
wp_terms:儲存每個目錄、標籤
wp_term_relationships:儲存每個文章、鏈接和對應分類的關係
wp_term_taxonomy:儲存每個目錄、標籤所對應的分類
wp_usermeta:儲存用戶的其他資訊
wp_users:用戶資訊


2022年6月24日 星期五

SC GRID 的 SAVE GRID "儲存檢視格式"的功能

 SAVE GRID 這個功能是儲存檢視格式的功能,不是儲存GRID資料值到資料庫的功能。

GRID 是一個報表顯示、展示、檢視的應用程式,並不是編輯資料用的,因此,沒有儲存資料的必要性。(編輯然後儲存資料的功能是 FORM)

所以,這裡的 SAVE GRID 就是儲存檢視格式的功能的意思。這是要釐清概念一下的地方。

使用 ScriptCase 的 GRID-User Defined 設計一個產品頁/部落格文章頁等

ScriptCase 的 GRID Application裡面有四種型態的GRID,其中一個 User Defined 可以使用 HTML Template (定義在 Layout->HTML Template )裡面,也就是可以自行設計一個 HTML 模板,裡面再來放置 資料欄位值,然後,配合 GRID其他屬性的設定,而顯示頁面出來。

SC提供的範例,是 CARD ,一頁可以顯示所有的 CARD,或是依照 GRID 參數的設定,而一次顯示一筆或多筆均可。

如果一次一頁只顯示一筆,也就是商城單一產品展示頁的功能,或是 部落格單一文章展示頁的功能。

要一次只讀取一筆資料,可以在  SQL 地方,增加一個 WHERE productid=[v_productid],再來處理 [v_productid] 可以是 GET/POST 的方式給予值,這樣這個GRID 就只有一筆特定ID的資料頁了。

要把GRID 內定的依些顯示資料,例如格子底部的 幾筆之幾筆 的信息隱藏起來,就在 onScriptInit Event 裡面,加上 將該 CSS ID 設成 display: none; 這樣就可以了!

其他要怎麼顯示的格式,就在  HTML Template 裡面去設計即可。

GRID 的 layout 的 header/footer 也可以依據需要,設定顯示或不顯示。



** 註:

ScriptCase 的 GRID Application裡面有四種型態的GRID:

  • 橫式:一般橫式表格橫列的方式呈現資料,等於是一個 表格 報表
  • 直式:直式方式,一筆資料是一直行
  • SLIDE:投影片式,也就是運用SC提供的 現有Layout 功能,製作顯示頁面,一次一頁一筆
  • User Defined自定義,也就是 HTML Template

ScriptCase 修改SC的CSS設定值

可以在 Application 的 Events 裡面的 onScriptInit 裡面添加 CSS 的定義,就可以修改掉 原本 SC的CSS設定,例如:希望將 GRID 的表格底部的訊息隱藏起來,不要出現,可以使用 網頁檢查 的方式,查到該信息的 ID 為:sc_grid_sumario

那段 html 為:

<tr id="sc_grid_sumario"> .....</tr>

所以,就可以在 onScriptInit 這個 Event 裡面,這樣改:

?>
<style>
#sc_grid_sumario {
  display: none;
}
</style>
<?php


註:

onScriptInit 會加在 <HTML><HEAD>............[加在這裡]</HEAD>  

onApplicationInit 會加在 [加在這裡]<HTML<HEAD>............</HEAD>

2022年6月17日 星期五

ScriptCase Import Application注意事項

剛才用 ScriptCase 做 Application import,結果因為在選擇語言時,沒有使用  Don't OverWrite選項,結果把我原本舊的也都蓋掉了!害我前面做的都做白工了!

紀錄一下這個經驗,以後,不要偷懶,要 import 時,只要選擇需要的就好,不需要的部分,就盡量都不要選!

唉!那語言的部分只好重來一次了!而且還要將不要的刪除,多浪費很多時間!

戒之哉!戒之哉!


註: ScriptCase的Language部分,刪除Table的部分,很麻煩,要一個一個刪除,沒有一個一次多選的功能!

2022年6月2日 星期四

PHP 浮點運算產生的問題,需要注意

PHP的浮點加減乘除運算,會產生小數位以下與設計師預期不一樣的結果。

例如: 
$sell_price = 123.456; 
$buy_price = 123.455; 
$t_diff = $sell_price - $buy_price; 
 預期結果是: 0.001,結果出來的是:0.00000000000098! 

這是因為浮點運算的緣故。原因就不說了。直接看如何處理?! 

 1. 先個別 x 1000,相減,然後再除1000 

 2. php提供了高精度計算的函式庫,實際上就是為了解決這個浮點數計算問題而生的。 

 主要函式有: 
  •  bcadd — 將兩個高精度數字相加 
  •  bccomp — 比較兩個高精度數字,返回-1, 0, 1 
  •  bcdiv — 將兩個高精度數字相除 
  •  bcmod — 求高精度數字餘數 
  •  bcmul — 將兩個高精度數字相乘 
  •  bcpow — 求高精度數字乘方 
  •  bcpowmod — 求高精度數字乘方求模,數論裡非常常用 
  •  bcscale — 配置預設小數點位數,相當於就是Linux bc中的”scale=” 
  •  bcsqrt — 求高精度數字平方根 
  •  bcsub — 將兩個高精度數字相減

** 切記:永遠不要相信浮點運算會精準到小數點最後一位,也不要拿浮點運算的數字來做比較是否相等?!

2022年5月27日 星期五

SC 裡面,直接開啟一個 Application 為新增模式 (sc_apl_conf()函數)

使用 sc_apl_conf("my_form", "start", "new"); 使用手冊以及 Youtube 的 說明中都是:這個必須被另一隻程式所呼叫 但,我直接測試放在該Form的 Events->onApplicationInit 裡面,一開啟,就直接進入 新增 模式 如果是另一隻程式呼叫的,在 Youtube 教學影片的示範是: 設計一隻 blank Application ,在 onExecute 中,直接寫兩行指令: sc_apl_conf("my_form", "start", "new"); sc_redir("my_form"); 然後,執行那隻 blank Application 就可以了! 另註:在 SC 所產生的 login 程式中,php Methods -> function sc_validate_success() 中 sc_apl_conf() 有被大量使用 用以定義權限 sc_apl_status($app, $perm['access']); sc_apl_conf($app, 'insert', $perm['insert']); sc_apl_conf($app, 'delete', $perm['delete']); sc_apl_conf($app, 'update', $perm['update']); sc_apl_conf($app, $perm['export'], 'xls'); sc_apl_conf($app, $perm['export'], 'word'); sc_apl_conf($app, $perm['export'], 'pdf'); sc_apl_conf($app, $perm['export'], 'xml'); sc_apl_conf($app, $perm['export'], 'csv'); sc_apl_conf($app, $perm['export'], 'rtf'); sc_apl_conf($app, $perm['export'], 'json'); sc_apl_conf($app, $perm['print'], 'print'); sc_apl_default('app1_Login', [sett_session_expire]);

2022年5月21日 星期六

SC - form application - layout裡面的block不對齊

如果 form application 裡面 layout有多個 block,且其中有50%-50%的block,就會發生不對齊的狀況。

使用 chrome 的檢查,查看產出的 html碼,發現產生的 table 的 align='center',如果改為 'left'就可以對齊!應該是因為 center 的設定,對於不同 block 的寬度來說,就會不一樣了。尤其是 一個橫列中藥有兩個block,分別 50%-50%,他們的 寬度就會產生不一樣的情形!

改善:盡量不要使用一列有兩個以上的block的設計!以免自找麻煩!



由Chrome的檢查中,找到 自定義 的 Application Theme 中,修改 CSS

方法:Layout -> Application Theme -> CSS Editor -> Form -> Table -> Others -> Width: 將95%改為100%

這樣,就不會因為align='center',由於寬度不同標準,而產生無法對齊的情形



2022年5月19日 星期四

SC-sc_format_num()應用在 sc_master_value('credit_amt', $value);

sc_lookup(result,"SELECT SUM(credit_amt) FROM gl_voucher_detail WHERE voucher_id = {voucher_id}");

//Using sc_format_num() to format the value that will be updated in the master application

//$value = sc_format_num({result[0][0]},",",".","2","N","1","");

//$value = {result[0][0]};

$value = number_format({result[0][0]},2);

sc_master_value('credit_amt', $value);

經過測試,使用 SC附的 sc_format_num(),出現在 master app上的都是空白!

如果不用 format,直接用SQL出來的值,會產生輸入格式不對!(master app 上的 credit_amt 欄位是 currency Type,小數點2位,我的資料庫欄位型態是 decimal(14,4))

最後使用 php 附的 number_format(value,2) 才解決問題!


這個是應用在 master-detail application 上,將 detail 的多筆加總,更新到 master 的總金額上。

sc_master_value() 這只是 更新 master application 的欄位,並沒有更新到 資料庫中,還需要操作者做儲存,才會更新到資料庫裡。

2022年4月6日 星期三

資料庫資料內容記錄設計的原則

資料庫設計內容記錄的原則,盡量直接紀錄以人眼直觀就可以理解的內容,不要再經過頭腦轉譯。

例如:數字序號的紀錄,跟資料記錄筆數有關的,資料庫紀錄的數字應該就直接是紀錄筆數,而不需要再加一,或減一。

在某些程式語言的陣列 ARRAY,其 index,有0 base、也有 1 base的,這就搞得設計師混亂!程式容易出錯!

希望 讓 CRON 要30秒執行一次

 CRON設定是最少一分鐘執行一次。

如果要小於60秒執行一次,就需要額外技巧:配合 sleep 30; 指令完成。

秒數必須是 60秒可以整除的,這樣才不會亂!例如:30秒、20秒、15秒、10秒等。

只要在 CRON 中這樣下:

* * * * <指令1>

* * * * sleep 30; <指令1>

這樣就可以一分鐘內,30秒自動執行一次。

如果是20秒,如下:

* * * * <指令1>

* * * * sleep 20; <指令1>

* * * * sleep 20; <指令1>

這樣就是一分鐘內,執行三次,每20秒一次。


2022年3月19日 星期六

MySQL IF EXIST UPDATE ELSE INSERT

 以下提供的是一般在大量倒資料時,會用到的,請僅慎使用!!

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


IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue') THEN

    UPDATE Table1 SET (...) WHERE Column1='SomeValue'

ELSE

    INSERT INTO Table1 VALUES (...)

END IF;

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


UPDATE Table1 SET (...) WHERE Column1='SomeValue'

IF @@ROWCOUNT=0

    INSERT INTO Table1 VALUES (...)

2022年3月3日 星期四

SC Layout 的 HTML Templates

 整個SC是一個完整的HTML APP 開發系統,他可以產生一個HTML頁。

預先設定的 Layout 可以套用 Header Template 以及 Footer Template,中間就留著放主內容Content APP。

如果有 HTML 的  <head></head>的內容要自己安插進去,就必須寫在 Events onApplicationInit 裡面。

然後,<boby></boby>裡面再分為 會系統重複的 header /footer


SC - FORM 表單設計

 FORM Application有四種不同的形態:

  1. Single Record:一個頁面一筆紀錄
  2. Multiple Records:一個頁面同時多筆紀錄;前面可以有選取勾勾,同時做多筆更新或刪除
  3. Editable grid:以方格式表現多筆紀錄同時編輯;每筆紀錄前面可有刪除、更新、複製等按鈕
  4. Editable grid view:以方格式表現多筆紀錄,但先只是只讀,需要再按一次按鈕才能編輯。

* 做購物車 Cart 更新功能時,SC online Shop 範例Samples 裡面有兩種做法:
  • my_cart :是 Grid Application
  • form_cart:是 Form Editable Grid Application
最後程式是用 my_cart Grid 作法。
序號、品名、[-]按鈕、數量、[+]按鈕、單價、金額

[-][+]按鈕,是使用 Ajax onClick Event 程式執行 數量的增減

2022年3月2日 星期三

SC 欄位效果:sc_input_group

有趣的文章內容,參考:

https://medium.com/scriptcase-master/bootstrap-input-group-in-scriptcase-mastertip09-a20a9a7dca5


1. 我將 sc_input_group(),寫到 internal libraries 裡面,這樣可以共用。

2. 記得使用時,需要先將 ajax_error_output 設成 OFF ,在 application -> Setting 裡面

3. 如果是在 Form 的單一Record 時,在 Event onLoad 裡面,設:

$arr_fields = [

['login'    , 'text', 'R$', 'right'],

['email', 'text', '@gmail.com', 'right'],

['nick_name'    , 'icon', 'fas fa-at', 'right']

];

sc_input_group($arr_fields,null);

如果是 multi records From ,在 EVENT onLoadRecord


# Form with multiple lines example

$arr_fields = [

['field_name', 'text', 'R$', 'right'],

['field_name', 'text', '@gmail.com', 'right'],

['field_name', 'icon', 'fas fa-at', 'right'],

['field_name', 'icon', 'fas fa-phone', 'right'],

['field_name', 'icon', 'fas fa-phone', 'right']

];

sc_input_group($arr_fields, $sc_seq_vert);



2022年3月1日 星期二

ERROR: CONSTANT DS ALREADY DEFINED

Constant 重複定義了! 

找到這個指令:

define('DS', DIRECTORY_SEPARATOR);

修改成這樣就可以了:

if(!defined('DS')){ define('DS',DIRECTORY_SEPARATOR); }

MySQL sql_mode=only_full_group_by

MySQL 產生 sql_mode=only_full_group_by

這是我做一個 View 裡面有 GROUP BY

在我的 Local MySQL沒有問題,上傳到  Server 就有問題了。

這一定就是版本不同的緣故。

於是網路搜尋:

https://www.gushiciku.cn/pl/pFxA/zh-tw

https://www.twle.cn/c/yufei/mysqlfav/mysqlfav-basic-sql_mode2.html

修改了 Server 上面 /etc/my.cnf

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

加上這段,重新啟動MySQL 就好了!

2022年1月15日 星期六

在 Centos 上安裝 Ghostscript ,這是 使用 PDF要用到的。

GhostScript:

https://www.ghostscript.com/index.html

下載:

https://www.ghostscript.com/releases/gsdnld.html

安裝:

在SSH終端上:

cd /usr/src

wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs9550/ghostscript-9.55.0.tar.gz

tar -xzvf ghostscript-9.55.0.tar.gz

cd ghostscript-9.55.0

./configure 

make

make install


在 使用 Imagick,使用 PDF 轉換 JPG,一直發生 Internal Error 500

經查了很久,才知道,Server必須安裝 PHP Imagick 以外,還有 GhostScript,這是一個 PDF 要用的免費程式。

我的主機上沒有,所以必須安裝起來。





在 PDF Report 裡面的  PDF Layout Code下面增加產生  PDF,轉 JPG 的程式

因為,我們不知道 SC產生的 PDF 檔案名稱,只好自己用自訂的PDF檔名來產生

然後,再由自己產生的 PDF 產生 JPG

$t_pdf_file = $_SERVER['DOCUMENT_ROOT']."/_lib/tmp/id_".{pay_form_id}."_pay_form.pdf";

$t_jpg_file = $_SERVER['DOCUMENT_ROOT']."/_lib/tmp/id_".{pay_form_id}."_pay_form.jpg";

$pdf->output($t_pdf_file,"F");

$im = new Imagick();

$im->setResolution(150, 150);

$im->readImage( $t_pdf_file );

$im->writeImages( $t_jpg_file, false );




** 還有 /domains/<websitename>.com/public_html/_lib/prod/third/wkhtmltopdf/linux-amd64/wkhtmltopdf-amd64 權限要設成 "777"




2022年1月11日 星期二

ScriptCase PDF 字型

 Scriptcase 的 PDF,如果使用預設字型,也就是在 PDF Application 的設定裡font 沒有設定字型,那麼,產生出來的結果,我的情形是在電腦上可以出現中文字型,但是在手機上,就沒有中文字型!

後來,試了很久,在 PDF Application 的設定裡字型改為其他字型,結果是中文字亂碼,試了幾個,以下是中文可以出現的:

  • kozminproregular
  • cid0jp
  • cid0ct
  • cid0kr
  • kozgopromedium
PDF的字型,是抓取機器上的字型,如果有特殊字型,需內嵌在PDF檔案裏面。
猜想,前面沒有設定字型,可能就是因為預設的字型,在手機上沒有,所以出現空白。
設定好字型以後,可能就內嵌在PDF檔案裡面了,可以正常顯示。

PDF手機字型顯示問題解決了!



2022年1月9日 星期日

ScriptCase 的 Application Field Type 是 Label / Text 使用

 ScriptCase 裡面的 Field Type

如果是設定為 Label,在 程式中,無法參照到值

必須設定為 Text,而底下的屬性設為 Label Field - Cannot be changed. 這樣程式才可以參照到值。


例如:一個 Control Application

兩個欄位:

{user}、{id}

如果 {id} 為  Label,則在程式中,{id}出來的是null

必須設 {id} 為 TEXT,底下的屬性設為 Label Field,這樣在程式中,{id}就可以抓到值了。

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

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