|
お世話になっております。 指定の梱包がうまくマイナスされているかチェックしたいのですが、 合ってますでしょうか? それほど、データ数は多くはないのですが、前半の抽出部分も遅いのですが、これはこんなものでしょうか? ご教授のほど、よろしくお願いいたします。
dim 梱包数,完成,必要 DosCmd("DEL "+GET_CUR_DIR+"\取寄転記データ.csv")
取寄 = fopen("取寄データ.csv") 転記 = fopen("取寄転記データ.csv",F_WRITE) 台帳 = fopen("梱包.CSV") dim 表題[] = "取寄??","品番","数","摘要","便名","箇所","着日","社内","梱包名","梱包数","企業体","ck" for x = 0 to length(表題[])-1 fput(転記,表題[x],1,x+1) next for i = 2 to fget(取寄, F_LINECOUNT) for p = 2 to fget(台帳, F_LINECOUNT) ifb fget(台帳,p,6) <> "" then ifb val(fget(取寄,i,8)) < 100000 then 必要 = FGet(取寄,i,1)+","+FGet(取寄,i,5)+","+FGet(取寄,i,6)+","+FGet(取寄,i,8)+","+FGet(取寄,i,10)+","+FGet(取寄,i,11)+","+FGet(取寄,i,12)+","+FGet(取寄,i,14) ifB fget(取寄,i,5) = fget(台帳,p,1) then 梱包数 = fget(台帳,p,3) * fget(取寄,i,6) 完成 = 必要+","+fget(台帳,p,2)+","+梱包数 * FGet(取寄,i,6)+","+fget(台帳,p,5) fput(転記,完成,0) elseif fget(取寄,i,5) = fget(台帳,p,2) then 梱包数 = fget(台帳,p,3) * fget(取寄,i,6) 完成 = 必要+","+fget(台帳,p,2)+","+fget(取寄,i,6)+","+fget(台帳,p,5) fput(転記,完成,0) break endif endif endif next next fclose(取寄) fclose(転記) fclose(台帳)
転記 = fopen("取寄転記データ.csv", F_READ or F_WRITE) for i = 2 to fget(転記, F_LINECOUNT) for p = 2 to fget(転記, F_LINECOUNT) ifb fget(転記,i,9) = fget(転記,p,9) then ifb fget(転記,i,7) = fget(転記,p,7) then ifb fget(転記,i,5) = fget(転記,p,5) then ifb fget(転記,i,6) = fget(転記,p,6) then ifb fget(転記,i,10) + fget(転記,p,10) = 0 then fput(転記,"○",i,12) break endif endif endif endif endif next next fclose(転記)
取寄データ.csv キー,??,枝番,行番号,品番,数,才数重量,摘要,在庫,便名,箇所,着日,仮,メモ,CK 045-01-01,0428045,01,01,K-1G , 1 , 186.80,7カワウチ , 0 ,1, ,160506,0, , 045-01-02,0428045,01,02,M1 , -1 , -39.68,7カワウチ , 0 ,1, ,160506,0, , 045-01-03,0428045,01,03,M6 , -1 , -2.00,7カワウチ , 0 ,1, ,160506,0, ,
取寄転記データ.csv ??,品番,数,摘要,便名,箇所,着日,社内メモ,梱包名,梱包数,企業体,ck 045-01-01,K-1,1,7カワウチ,1,,160506, ,M1,1,ユ,○ 045-01-01,K-1,1,7カワウチ,1,,160506, ,M6,1,ユ,○ 045-01-02,M1,-1,7カワウチ,1,,160506, ,M1,-1,ユ,○ 045-01-03,M6,-1,7カワウチ,1,,160506, ,M6,-1,ユ,○
梱包.CSV 間口,梱包,数,掛率,企業体,?d K-1,M1,1,999,ユ,消 K-1,M6,1,999,ユ,消
|
No.2366 2016/04/29(Fri) 10:28:30
|
☆ Re: 差し引きデータのチェック / Liners |
|
|
>合ってますでしょうか? う〜ん。正直わからない。何が正解なのか明確でない。 提示されたデータでは、結果が違うため[取寄転記データ.csvは2行で○が付かない] そう言った意味では、「合っていない」
もう少し簡素化したもので検討すべき。気になるのは、重複を許しているようで、データ構造を触っている気がします。
>前半の抽出部分も遅いのですが、これはこんなものでしょうか? 遅い基準が不明。このデータでは1秒以内の反応なので速度は十分。
そもそも巨大なデータをUWSCで扱うべきではなく、数万件程度のデータを連想配列などで利用するのが実用的。 その為には、重複しないデータが必要で、通常の管理されたデータは、ほとんどそうなっている。
とは言うものの速度的な改善は、現状でも十分可能。ただし、速度よりも正確さ・読み易さの方が優先。 手法としては、変動しない値をループ外へ出すのが基本。
具体的な数値は、梱包.CSVを10万倍[20万行]にしたデータで、当方の環境では66秒から13秒[約4.7倍]になった。
|
No.2367 2016/04/29(Fri) 21:43:24
|
|
☆ Re: 差し引きデータのチェック / sen |
|
|
>気になるのは、重複を許しているようで
K-1が商品名で、M1・M6がその商品の複数梱包の一部です。M1・M6はすでに営業所に入荷していまして、それをマイナスした明細を作成する必要があります。 最初は、K-1で入力されまして梱包が入荷済みの商品を見つけ、その該当梱包を見つけM1・M6をマイナス梱包します。 そこがうまくいっているか確認をしているのですが、現状目視のところをパソコンでしたいという希望なのです。 よって、重複は必要なのです。
>データ構造を触っている気がします。
済みません。会社の内容に触れるので、具体的な部分を少し削りました。誤K-1G→K-1
>そもそも巨大なデータをUWSCで扱うべきではなく、数万件程度のデータを連想配列などで利用するのが実用的。
実際は、梱包.CSVは200行・取寄データ.csvは300行です。
>その為には、重複しないデータが必要で、通常の管理されたデータは、ほとんどそうなっている。
上記の理由により、どうしても重複が必要です。「梱包展開」と言ってます。
>とは言うものの速度的な改善は、現状でも十分可能。ただし、速度よりも正確さ・読み易さ>の方が優先。
おっしゃる通りです。
仕事の中でやってみたい例はたくさんありまして、UWSCでやると魔法みたいな感じです。 fget・fputを活用して、CSVファイルの出し入れを普通にできるようになりたいです。 よろしくお願いいたします。
|
No.2368 2016/04/30(Sat) 07:15:22
|
|
☆ Re: 差し引きデータのチェック / Liners |
|
|
>K-1が商品名で、M1・M6がその商品の複数梱包の一部・どうしても重複が必要 やはり展開後のデータでしたか…重複が必要で、データ構造が不明または暗黙の了解となると通常での実装は困難になります。
そうゆう理由なら上記のように全数検索になるのは仕方のないことで、「現場」ではあり得ますね。 一部構成が判明したので、取寄データ.csvのK-1G→K-1と訂正すると取寄転記データ.csvと同じなりました。
この訂正で、チェックが機能していることは分かりました。 これで良いかは、多くのデータで senさんが検証してみる必要があるでしょう。
こういった場合のスクリプトの組み方は、極力、人間が行う手順を再現することです。 そうすることで、想定外のエラーを減らすことが出来、うまくいく場合が多いものです。
実行速度に関しては、最後に検討すべきですが、全数検索なので200x300=60000件…少し荷が重そうです。 下記は、速度検証した時の変更部分の抜粋です。テストではデータ量が増えると5倍速以上なりましたが実データでは不明です。
ループ外への追い出しを行った「急贓品」で「あまり褒められたものではない」が「使えます」 まあ「彼」くらい速くなってくれれは御の字でしょう。もちろん自己責任で。
for x = 0 to length(表題[])-1 fput(転記,表題[x],1,x+1) next 台帳COUNT = fget(台帳, F_LINECOUNT)
for i = 2 to fget(取寄, F_LINECOUNT) v = val(fget(取寄,i,8)); 取寄5 = fget(取寄,i,5); 取寄6 = fget(取寄,i,6) 必要 = FGet(取寄,i,1)+"," + 取寄5 + "," + 取寄6 + ","+FGet(取寄,i,8)+","+FGet(取寄,i,10)+","+FGet(取寄,i,11)+","+FGet(取寄,i,12)+","+FGet(取寄,i,14)+"," for p = 2 to 台帳COUNT if fget(台帳,p,6) = "" and v >= 100000 then continue if 取寄5 = fget(台帳,p,1) then 梱包数 = fget(台帳,p,3) * 取寄6 完成 = 必要 + fget(台帳,p,2)+","+ 梱包数 * 取寄6 + ","+fget(台帳,p,5) fput(転記,完成,0) elseif 取寄5 = fget(台帳,p,2) then 梱包数 = fget(台帳,p,3) * 取寄6 完成 = 必要 + fget(台帳,p,2) + "," + 取寄6 + "," + fget(台帳,p,5) fput(転記,完成,0) break endif next next
|
No.2369 2016/04/30(Sat) 13:15:29
|
|
☆ Re: 差し引きデータのチェック / sen |
|
No.2374 2016/05/01(Sun) 18:02:54
|
|