VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

請教在欄位中加數字的問題(要依照位置來加)
前往頁面 1, 2, 3  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
sthuang66



註冊時間: 2014-04-27
文章: 178


第 1 樓

發表發表於: 星期二 四月 05, 2016 2:39 am    文章主題: 請教在欄位中加數字的問題(要依照位置來加) 引言回覆

公司軟體資料中有一個檔案中的欄位很特別!現在我想export來用但是有點難度!因為已經搞了兩天!是有點進展勉強可以用!所以又到論壇來請教高手!麻煩各位不吝指教!
請先參考我附上50筆資料檔案
我先簡述問題所在!檔案有seq,times,path,location共四個欄位!其中問題出在path這個上面!這個欄位是C(12)格式!只能被填入六個字!因為它是軟體用form填入!
舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 <---- path欄位中每個字位置,若是1在123位置我希望處理後加入1變成11,,若是1在456位置我希望處理後加入2變成21,在789位置我希望處理後加入3變成31,在101112位置我希望處理後加入4變成41
1

1 2 3 4 5 6 7 8 9 10 11 12<---- path欄位
6 A D 3
輸出變成161A1D23
-------------------------------------------------------------------------------
其實我們原來是利用軟體來記錄四個區域的資料!軟體商設計時預設把path欄位中第一到第三字是填入Q1資料!第4到第6字是填入Q2資料!第7到第9字是填入Q3資料!第10到第12字是填入Q4資料!
所以我只要把PATH每三個拆掉即可!所以以下是我目前的進展!可以辨識!但是無法像上面所說的依照位置加入數字

SELECT *,SUBSTR(PATH,1,3) AS Q1 FROM D1 WHERE LEN(ALLTRIM(SUBSTR(PATH,1,3)))>0 INTO TABLE T1
SELECT *,SUBSTR(PATH,4,3) AS Q2 FROM D1 WHERE LEN(ALLTRIM(SUBSTR(PATH,4,3)))>0 INTO TABLE T2
SELECT *,SUBSTR(PATH,7,3) AS Q3 FROM D1 WHERE LEN(ALLTRIM(SUBSTR(PATH,7,3)))>0 INTO TABLE T3
SELECT *,SUBSTR(PATH,10,3) AS Q4 FROM D1 WHERE LEN(ALLTRIM(SUBSTR(PATH,10,3)))>0 INTO TABLE T4
CLOSE DATABASES ALL
USE T1
ALTER TABLE T1 ADD Q2 C(3)
ALTER TABLE T1 ADD Q3 C(3)
ALTER TABLE T1 ADD Q4 C(3)

APPEND FROM T2
APPEND FROM T3
APPEND FROM T4

COPY TO RESULT
所以RESULT檔就多有有,q1,q2,q3,q4四個新欄位!這樣已經可以讓我使用!
但是想到軟體商在原始設計時讓前端使用者只能輸入6個字元!但是欄位卻是C(12)!軟體商的確也有寫出像我上面所提的輸出模式可以螢幕上看!但是temp檔看完就刪掉!看不出蛛絲馬跡!
------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以我不死心就把PATH拆成12個
SELECT *,SUBSTR(CURE_PATH,1,1) AS Q1_1 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,1,1)))>0 INTO TABLE T1
SELECT *,SUBSTR(CURE_PATH,2,1) AS Q1_2 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,2,1)))>0 INTO TABLE T2
SELECT *,SUBSTR(CURE_PATH,3,1) AS Q1_3 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,3,1)))>0 INTO TABLE T3
SELECT *,SUBSTR(CURE_PATH,4,1) AS Q2_1 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,4,1)))>0 INTO TABLE T4
SELECT *,SUBSTR(CURE_PATH,5,1) AS Q2_2 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,5,1)))>0 INTO TABLE T5
SELECT *,SUBSTR(CURE_PATH,6,1) AS Q2_3 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,6,1)))>0 INTO TABLE T6
SELECT *,SUBSTR(CURE_PATH,7,1) AS Q3_1 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,7,1)))>0 INTO TABLE T7
SELECT *,SUBSTR(CURE_PATH,8,1) AS Q3_2 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,8,1)))>0 INTO TABLE T8
SELECT *,SUBSTR(CURE_PATH,9,1) AS Q3_3 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,9,1)))>0 INTO TABLE T9
SELECT *,SUBSTR(CURE_PATH,10,1) AS Q4_1 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,10,1)))>0 INTO TABLE T10
SELECT *,SUBSTR(CURE_PATH,11,1) AS Q4_2 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,11,1)))>0 INTO TABLE T11
SELECT *,SUBSTR(CURE_PATH,12,1) AS Q4_3 FROM OP2 WHERE LEN(ALLTRIM(SUBSTR(CURE_PATH,12,1)))>0 INTO TABLE T12

CLOSE DATABASES ALL
USE T1
ALTER TABLE T1 ALTER Q1_1 C(2)
ALTER TABLE T1 ADD Q1_2 C(2)
ALTER TABLE T1 ADD Q1_3 C(2)
ALTER TABLE T1 ADD Q2_1 C(2)
ALTER TABLE T1 ADD Q2_2 C(2)
ALTER TABLE T1 ADD Q2_3 C(2)

ALTER TABLE T1 ADD Q3_1 C(2)
ALTER TABLE T1 ADD Q3_2 C(2)
ALTER TABLE T1 ADD Q3_3 C(2)
ALTER TABLE T1 ADD Q4_1 C(2)
ALTER TABLE T1 ADD Q4_2 C(2)
ALTER TABLE T1 ADD Q4_3 C(2)

APPEND FROM T2
APPEND FROM T3
APPEND FROM T4
APPEND FROM T5
APPEND FROM T6
APPEND FROM T7
APPEND FROM T8
APPEND FROM T9
APPEND FROM T10
APPEND FROM T11
APPEND FROM T12

SELECT * FROM T1 ORDER BY SEQ,TIMES,ORDER_CODE INTO TABLE TEST
CLOSE DATABASE ALL
FOR I = 1 TO 12
J=ALLTRIM(STR(I))
ERASE 'T'+J+'.DBF'
ENDFOR
------------------------------------------------------------------------------------------------------------------------
然後12個位置慢慢加
UPDATE TEST SET Q1_3="11" WHERE Q1_3="1"
UPDATE TEST SET Q1_2="11" WHERE Q1_2="1"
UPDATE TEST SET Q1_1="11" WHERE Q1_1="1"
UPDATE TEST SET Q1_3="12" WHERE Q1_3="2"
UPDATE TEST SET Q1_2="12" WHERE Q1_2="2"
UPDATE TEST SET Q1_1="12" WHERE Q1_1="2"
UPDATE TEST SET Q1_3="13" WHERE Q1_3="3"
UPDATE TEST SET Q1_2="13" WHERE Q1_2="3"
UPDATE TEST SET Q1_1="13" WHERE Q1_1="3"
UPDATE TEST SET Q1_3="14" WHERE Q1_3="4"
UPDATE TEST SET Q1_2="14" WHERE Q1_2="4"
UPDATE TEST SET Q1_1="14" WHERE Q1_1="4"
UPDATE TEST SET Q1_3="15" WHERE Q1_3="5"
UPDATE TEST SET Q1_2="15" WHERE Q1_2="5"
UPDATE TEST SET Q1_1="15" WHERE Q1_1="5"
UPDATE TEST SET Q1_3="16" WHERE Q1_3="6"
UPDATE TEST SET Q1_2="16" WHERE Q1_2="6"
UPDATE TEST SET Q1_1="16" WHERE Q1_1="6"
UPDATE TEST SET Q1_3="17" WHERE Q1_3="7"
UPDATE TEST SET Q1_2="17" WHERE Q1_2="7"
UPDATE TEST SET Q1_1="17" WHERE Q1_1="7"
UPDATE TEST SET Q1_3="18" WHERE Q1_3="8"
UPDATE TEST SET Q1_2="18" WHERE Q1_2="8"
UPDATE TEST SET Q1_1="18" WHERE Q1_1="8"
UPDATE TEST SET Q1_3="19" WHERE Q1_3="9"
UPDATE TEST SET Q1_2="19" WHERE Q1_2="9"
UPDATE TEST SET Q1_1="19" WHERE Q1_1="9"

UPDATE TEST SET Q2_3="21" WHERE Q2_3="1"
UPDATE TEST SET Q2_2="21" WHERE Q2_2="1"
UPDATE TEST SET Q2_1="21" WHERE Q2_1="1"
UPDATE TEST SET Q2_3="22" WHERE Q2_3="2"
UPDATE TEST SET Q2_2="22" WHERE Q2_2="2"
UPDATE TEST SET Q2_1="22" WHERE Q2_1="2"
UPDATE TEST SET Q2_3="23" WHERE Q2_3="3"
UPDATE TEST SET Q2_2="23" WHERE Q2_2="3"
UPDATE TEST SET Q2_1="23" WHERE Q2_1="3"
UPDATE TEST SET Q2_3="24" WHERE Q2_3="4"
UPDATE TEST SET Q2_2="24" WHERE Q2_2="4"
UPDATE TEST SET Q2_1="24" WHERE Q2_1="4"
UPDATE TEST SET Q2_3="25" WHERE Q2_3="5"
UPDATE TEST SET Q2_2="25" WHERE Q2_2="5"
UPDATE TEST SET Q2_1="25" WHERE Q2_1="5"
UPDATE TEST SET Q2_3="26" WHERE Q2_3="6"
UPDATE TEST SET Q2_2="26" WHERE Q2_2="6"
UPDATE TEST SET Q2_1="26" WHERE Q2_1="6"
UPDATE TEST SET Q2_3="27" WHERE Q2_3="7"
UPDATE TEST SET Q2_2="27" WHERE Q2_2="7"
UPDATE TEST SET Q2_1="27" WHERE Q2_1="7"
UPDATE TEST SET Q2_3="28" WHERE Q2_3="8"
UPDATE TEST SET Q2_2="28" WHERE Q2_2="8"
UPDATE TEST SET Q2_1="28" WHERE Q2_1="8"
UPDATE TEST SET Q2_3="29" WHERE Q2_3="9"
UPDATE TEST SET Q2_2="29" WHERE Q2_2="9"
UPDATE TEST SET Q2_1="29" WHERE Q2_1="9"

UPDATE TEST SET Q3_3="31" WHERE Q3_3="1"
UPDATE TEST SET Q3_2="31" WHERE Q3_2="1"
UPDATE TEST SET Q3_1="31" WHERE Q3_1="1"
UPDATE TEST SET Q3_3="32" WHERE Q3_3="2"
UPDATE TEST SET Q3_2="32" WHERE Q3_2="2"
UPDATE TEST SET Q3_1="32" WHERE Q3_1="2"
UPDATE TEST SET Q3_3="33" WHERE Q3_3="3"
UPDATE TEST SET Q3_2="33" WHERE Q3_2="3"
UPDATE TEST SET Q3_1="33" WHERE Q3_1="3"
UPDATE TEST SET Q3_3="34" WHERE Q3_3="4"
UPDATE TEST SET Q3_2="34" WHERE Q3_2="4"
UPDATE TEST SET Q3_1="34" WHERE Q3_1="4"
UPDATE TEST SET Q3_3="35" WHERE Q3_3="5"
UPDATE TEST SET Q3_2="35" WHERE Q3_2="5"
UPDATE TEST SET Q3_1="35" WHERE Q3_1="5"

UPDATE TEST SET Q3_3="36" WHERE Q3_3="6"
UPDATE TEST SET Q3_2="36" WHERE Q3_2="6"
UPDATE TEST SET Q3_1="36" WHERE Q3_1="6"

UPDATE TEST SET Q3_3="37" WHERE Q3_3="7"
UPDATE TEST SET Q3_2="37" WHERE Q3_2="7"
UPDATE TEST SET Q3_1="37" WHERE Q3_1="7"

UPDATE TEST SET Q3_3="38" WHERE Q3_3="8"
UPDATE TEST SET Q3_2="38" WHERE Q3_2="8"
UPDATE TEST SET Q3_1="38" WHERE Q3_1="8"

UPDATE TEST SET Q3_3="39" WHERE Q3_3="9"
UPDATE TEST SET Q3_2="39" WHERE Q3_2="9"
UPDATE TEST SET Q3_1="39" WHERE Q3_1="9"

UPDATE TEST SET Q4_3="41" WHERE Q4_3="1"
UPDATE TEST SET Q4_2="41" WHERE Q4_2="1"
UPDATE TEST SET Q4_1="41" WHERE Q4_1="1"

UPDATE TEST SET Q4_3="42" WHERE Q4_3="2"
UPDATE TEST SET Q4_2="42" WHERE Q4_2="2"
UPDATE TEST SET Q4_1="42" WHERE Q4_1="2"

UPDATE TEST SET Q4_3="43" WHERE Q4_3="3"
UPDATE TEST SET Q4_2="43" WHERE Q4_2="3"
UPDATE TEST SET Q4_1="43" WHERE Q4_1="3"

UPDATE TEST SET Q4_3="44" WHERE Q4_3="4"
UPDATE TEST SET Q4_2="44" WHERE Q4_2="4"
UPDATE TEST SET Q4_1="44" WHERE Q4_1="4"

UPDATE TEST SET Q4_3="45" WHERE Q4_3="5"
UPDATE TEST SET Q4_2="45" WHERE Q4_2="5"
UPDATE TEST SET Q4_1="45" WHERE Q4_1="5"

UPDATE TEST SET Q4_3="46" WHERE Q4_3="6"
UPDATE TEST SET Q4_2="46" WHERE Q4_2="6"
UPDATE TEST SET Q4_1="46" WHERE Q4_1="6"

UPDATE TEST SET Q4_3="47" WHERE Q4_3="7"
UPDATE TEST SET Q4_2="47" WHERE Q4_2="7"
UPDATE TEST SET Q4_1="47" WHERE Q4_1="7"

UPDATE TEST SET Q4_3="48" WHERE Q4_3="8"
UPDATE TEST SET Q4_2="48" WHERE Q4_2="8"
UPDATE TEST SET Q4_1="48" WHERE Q4_1="8"

UPDATE TEST SET Q4_3="49" WHERE Q4_3="9"
UPDATE TEST SET Q4_2="49" WHERE Q4_2="9"
UPDATE TEST SET Q4_1="49" WHERE Q4_1="9"
--------------------------------------------------------------------------
這個土方法好像在某些位置轉換會出錯!真的是想破頭不理解!謝謝大家耐心看完並給我指導!萬分感激
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 178


第 2 樓

發表發表於: 星期二 四月 05, 2016 2:43 am    文章主題: 引言回覆

補充一下!如果有兩個英文字母例如FM,UL的就無須加1,2,3,4
回頂端
檢視會員個人資料 發送私人訊息
perry



註冊時間: 2014-07-20
文章: 203


第 3 樓

發表發表於: 星期二 四月 05, 2016 11:17 am    文章主題: 引言回覆

用 Scan 比較簡單
代碼:

PRIV P_STR,I,N_STR,J
P_STR='111222333444'
SET EXCL OFF
SELE 0
USE D1 AGAI
SELE 0
SELE *,SPAC(12) AS NEWPATH FROM D1 INTO DBF TESTD1
GO TOP
SCAN
    N_STR=''
    FOR I=1 TO 12
        J=SUBS(PATH,I,1)
        IF J#' '
            IF J>='A' AND I<12 AND SUBS(PATH,I+1,1)>='A'  &&排除連續 2 個都是英文
                I=I+1
            ELSE
                N_STR=N_STR+SUBS(P_STR,I,1)+SUBS(PATH,I,1)
                * 或
                *N_STR=N_STR+STR(INT((I-1)/3)+1,1)+SUBS(PATH,I,1)
            ENDI
        ENDI
    NEXT
    REPL NEWPATH WITH N_STR
ENDS
GO TOP
BROW
USE IN D1
USE IN TESTD1
ERAS TESTD1.DBF
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 178


第 4 樓

發表發表於: 星期二 四月 05, 2016 11:38 am    文章主題: 引言回覆

謝謝Perry指導!因為我的迴圈的功力太差!所以在想這個問題比較不週全!我立刻試試!感恩
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4249
來自: Taipei,Taiwan

第 5 樓

發表發表於: 星期三 四月 06, 2016 8:55 am    文章主題: 引言回覆

樓主好像不太習慣傳統的XBASE 語法.
舊的PO文都習慣用 SQL COMMAND 解決問題.

這樣其實也沒什麼不對.
只是在使用SQL COMMAND 時,
還是要想想這些語法實際上是怎麼操作資料的,
才可以避免寫出沒有效率或是錯誤的命令.

早年剛剛學習SQL,
也會動不動就想用SQL解決.
但後來就知道,
SQL 要寫得好,準確,有效率,
其實要學習很多基本資料操作的知識.
即便是T-SQL, oracle, mysql..... 都是一樣.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
sthuang66



註冊時間: 2014-04-27
文章: 178


第 6 樓

發表發表於: 星期四 四月 07, 2016 1:20 am    文章主題: 引言回覆

謝謝各位高手的提醒!我的確是先學簡單SQL後才加減學Xbase語法!所以功力很差!只是關於VFP的範例或是書很難找!所以常常上來問!真得很感激各位的解答!其實我問這個題目時有把它精簡一下!實際上有稍微複雜一點! 謝謝Perry得幫忙!我按照你的邏輯自己修正好可以用了!謝謝不吝指教!又很詳細下註解
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4249
來自: Taipei,Taiwan

第 7 樓

發表發表於: 星期四 四月 07, 2016 8:56 am    文章主題: Re: 請教在欄位中加數字的問題(要依照位置來加) 引言回覆

sthuang66 寫到:
原始設計時讓前端使用者只能輸入6個字元!但是欄位卻是C(12)!



其實這個是關鍵吧.

你的資料裡有 "__1_D__7_3_8"
但我覺得假設12字元都可以處理的話,先做成C(24).
處理成 "____11__2D____37__43__48"
再清除掉SPACE 字元.

"__1_D__7_3_8"
=> "___1_D__7_3_8"
=> "____1_D__7_3_8"
=> "____11_D__7_3_8"
.
.
.
=> "____11__2D____37__43__48"

=>"112D374348"

代碼:

USE TBL1  IN 0 EXCLUSIVE
ALTER TABLE  TBL1 ALTER PATH C(24)

FOR I=1 TO 12
   UPDATE TBL1  SET PATH = SUBSTR(PATH,1,2*(I-1))  ;  && <= 藍色那段
      + IIF(SUBSTR(PATH,2*(I-1)+1,1)=' ',' '+SUBSTR(PATH,2*(I-1)+1,1),LTRIM(STR(CEILING(I/3)))+SUBSTR(PATH,2*(I-1)+1,1))  ;  && <= 紅色那段
      + SUBSTR(PATH,2*I)  ;  && <= 綠色那段
        WHERE ALLTRIM(PATH) !='FM' AND ALLTRIM(PATH) !='UL'
NEXT

UPDATE TBL1 SET PATH = CHRTRAN(PATH, ' ', '')  WHERE ALLTRIM(PATH) !='FM' AND ALLTRIM(PATH) !='UL'


上面未debug,意思看懂就好.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙


syntech 在 星期四 四月 07, 2016 4:55 pm 作了第 2 次修改
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
sthuang66



註冊時間: 2014-04-27
文章: 178


第 8 樓

發表發表於: 星期四 四月 07, 2016 1:07 pm    文章主題: 引言回覆

謝謝Syntec兄關注!你的代碼很精簡!我會努力看懂試試看!
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4249
來自: Taipei,Taiwan

第 9 樓

發表發表於: 星期四 四月 07, 2016 1:53 pm    文章主題: 引言回覆

其實3樓的方式跑起來比較快.

程式短不見得比較快,
反而很慢,
這個方式用了13次table scan.

純粹只是為了sql而sql.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 10 樓

發表發表於: 星期四 四月 07, 2016 3:07 pm    文章主題: 引言回覆

syntech 寫到:

也會動不動就想用SQL解決.


如果SQL能解決的,我都不想用傳統語法解決!
sql往往一行能處理的,用傳統語法要很多行

select 0
use xxx
scan
xxxxxxx
endcsan
use

至少得六行,很不環保
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
syntech



註冊時間: 2003-05-16
文章: 4249
來自: Taipei,Taiwan

第 11 樓

發表發表於: 星期四 四月 07, 2016 4:45 pm    文章主題: 引言回覆

太複雜的sql 寫起來很累.
要思考機器怎麼執行這段命令,還很容易把範圍搞錯.


程度不及從小就活在sql語法的許多神人. XD

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
bx1166



註冊時間: 2011-12-06
文章: 273


第 12 樓

發表發表於: 星期四 四月 07, 2016 5:41 pm    文章主題: 引言回覆

syntech 寫到:
太複雜的sql 寫起來很累.
要思考機器怎麼執行這段命令,還很容易把範圍搞錯.


程度不及從小就活在sql語法的許多神人. XD



邏輯正確性而言,xbase我覺得比較容易弄清楚,刪除掉不要的,剩餘的自然就是答案了。
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 178


第 13 樓

發表發表於: 星期一 四月 11, 2016 5:09 pm    文章主題: 引言回覆

我原本想要處理的是必較複雜一點!所以我有精簡一下再問!原來是path欄位中
除了有1~9數字外!其實有英文字!只是英文字有兩種!兩個連在一起的只有FM 還有U* 或試L*這個都不用拆!!另外有ABCDE五個英文字的就麻煩一點!前三個要用5取代其次4~6位置要用6取代!7~9位置要用7取代!10~12位置要用8取代!除此外A也要改成1
123456789 10 11 12
A
要1A改成51 3D 改成74 4B要改82

我按照Perry邏輯改寫好如下
PRIVATE P_STR,I,N_STR,J
P_STR='111222333444'
D_STR='555666777888'
SET EXCLUSIVE OFF
SELECT 0
USE d1 AGAIN
SELECT 0
SELECT *,SPACE(12) AS CURE_PATH FROM d1 INTO DBF TESTD1
GO TOP
SCAN
N_STR=''
FOR I=1 TO 12
J=SUBSTR(PATH,I,1)
IF J#' '
DO CASE
CASE J='F' OR J='U' OR J='L' &&排除FM,U*,L*
N_STR=N_STR+SUBSTR(PATH,I,1)+SUBSTR(PATH,I+1,1)
I=I+1
CASE J='E'
N_STR=N_STR+SUBSTR(D_STR,I,1)+"5"
CASE J='D'
N_STR=N_STR+SUBSTR(D_STR,I,1)+"4"
CASE J='C'
N_STR=N_STR+SUBSTR(D_STR,I,1)+"3"
CASE J='B'
N_STR=N_STR+SUBSTR(D_STR,I,1)+"2"
CASE J='A'
N_STR=N_STR+SUBSTR(D_STR,I,1)+"1"
OTHERWISE
N_STR=N_STR+SUBS(P_STR,I,1)+SUBS(PATH,I,1)
* 或
*N_STR=N_STR+STR(INT((I-1)/3)+1,1)+SUBS(PATH,I,1)
ENDCASE
ENDIF
ENDFOR
REPLACE CURE_PATH WITH N_STR
ENDSCAN
GO TOP
COPY TO d2
USE IN d1
USE IN TESTD1
---------------------------------------------------------------------
syntech SQL方法我有試了!完全沒有錯!只是我功力差有點看不懂你說明!它比Xbase快了一點!只是我沒有很懂所以無法改寫成上面我說的需求

謝謝兩位高手指教!我又有進步一些!!!
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4249
來自: Taipei,Taiwan

第 14 樓

發表發表於: 星期一 四月 11, 2016 5:36 pm    文章主題: 引言回覆

1.ABCDE 的問題, "LTRIM(STR(CEILING(I/3)))+SUBSTR(PATH,2*(I-1)+1,1))" 這句調整就可以了.

2.FM 還有U* 或試L*這個都不用拆, "WHERE ALLTRIM(PATH) !='FM' AND ALLTRIM(PATH) !='UL' " 這句調整就可以了.


也可以後來再轉換ABCDE.這時兩個兩個一組UPDATE就可以了,


----
其實我通常都花在怎麼找出問題的較佳解法,
而不是一下子就硬幹.
找出較佳解法時就要好好思考怎麼歸納結果,
有幾種解法?各解法的優劣及限制為何?各解法執行次數多少?
還要兼擔任人體interpreter,翻譯實際上會如何運作.
這樣才可以應付未來的變化,也會知道這個方法的限制在哪裡.
練習久了,當老闆在問你問題的時候,
你腦子裡就會即時浮出好幾種解法以及每種解法的限制,
老闆問完問題了,你的腦子早就有答案,
能做還是不能做,要做的話該怎麼做.
這個就跟下棋一樣. Very Happy

真正打字都是很後面的事了,
不用花很多時間.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
perry



註冊時間: 2014-07-20
文章: 203


第 15 樓

發表發表於: 星期一 四月 11, 2016 5:47 pm    文章主題: 引言回覆

條件式越多執行越慢!!
最好是資料出現越多的,優先判斷,亦可省略多判斷的時間@@
代碼:

x=path+' '
For I=1 to 12
J=UPPE(subs(x,i,1))
Do Case
    *資料內容組合大概分成下列4種
    Case J=' '
    Case J$'FUL' and I<12
        *如果有連續2英文的不會摻雜其他資料
        *N_STR=CHRT(x,' ','')
        *EXIT    &&結束迴圈
        N_STR=N_STR+J+subs(x,i+1,1)
        I=I+1
    Case J>='A'
        N_STR=N_STR+subs(d_str,i,1)+chr(asc(J)-16)  &&asc 49 ='1'
    Othe
        N_STR=N_STR+subs(p_str,i,1)+J
EndCase
Next
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2, 3  下一頁
1頁(共3頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作