115272
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオン
動作不具合での質問の場合には環境を表記(OS,バージョン等)
タイトルは内容を表し、内容はネットゲーム関係禁止
自身でコードを書く気の無いナマケモノは特に質問禁止
失敗作でもコードを投稿すること(具体性の無い質問は無視される可能性大)

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
環境設定[s7777777]

UwscWebDriver 0.4.0 (Chromium Edge対応) / stuncloud
https://github.com/stuncloud/UwscWebDriver/releases/tag/0.4.0

Chromiumベースの新しいMS Edgeに対応しました
この更新には破壊的変更が加えられており、旧MS Edge(MS Edge Legacy)を使うスクリプトは修正が必要になります

旧: driver = WebDriver.Start(WebDriver.Edge)

新: driver = WebDriver.EdgeLegacy() // Start(WebDriver.EdgeLegacy) でもOK

旧: WebDriverDownload.Edge()

新: WebDriverDownload.EdgeLegacy()

新Edgeは以下で使用できます

WebDriverDownload.ChromiumEdge(83) // バージョン83のmsedgedriverをダウンロード
driver = WebDriver.ChromiumEdge() // Start(WebDriver.ChromiumEdge) でもOK

Chrome、Firefoxにもwebdriver取得用の新しい関数が追加されています

driver = WebDriver.Chrome()
driver = WebDriver.Firefox()

No.883 2020/06/16(Tue) 14:28:18

Re: UwscWebDriver 0.4.0 (Chromium Edge対応) / ojin
Chrome最新83、問題なく使えました。
stuncloudさん、助かります、素晴らしいありがとうございます。

No.884 2020/06/17(Wed) 06:20:51
変数を増やす / keropi
お世話になります。
以下で、a3に追加することで、a5を取り出すには、どうすればよろしいでしょうか、変数を増やす、配列などが必要となるのでしょうか。
a3="30"
a4="40"
a5="50"

b5="a"+3+2
dim c5="a"+(3+2)

print a3 //30
print a3+2 //302
print b5 //a32
print c5 //a5

print a3+i みたいな形で、50と表示したいです。

No.879 2020/06/14(Sun) 09:06:35

Re: 変数を増やす / satocha
evalを使います。
こんな感じで変数s3〜a5を出力できます。
a3="30"
a4="40"
a5="50"
for i=3 to 5
 変数名="a"+i
 msgbox(変数名+"="+eval(変数名))
next


> お世話になります。
> 以下で、a3に追加することで、a5を取り出すには、どうすればよろしいでしょうか、変数を増やす、配列などが必要となるのでしょうか。
> a3="30"
> a4="40"
> a5="50"
>

No.880 2020/06/14(Sun) 09:30:30

Re: 変数を増やす / stuncloud
> a3に追加することで、a5を取り出す
無理です
a5と等しい値を算出したい、ということなら

print val(a3)+(val(a5)-val(a3))

となりますがこれはよく見たらわかりますけど

print val(a5)

と変わらんので最初から

print a5

で良いと思います
a3を起点にする必要がどこにもない

…待てよ

i = 2
print eval("a" + 3 + i)

こういうこと?
あ、なんとなく意図がわかってきた気がするぞ
おそらく希望の動作を実現したいなら

dim a[5]
a[3] = "30"
a[4] = "40"
a[5] = "50"

i = 2
print a[3+i]

こんなふうに配列にして添字を計算するのが一番近いんじゃないかと思います

No.881 2020/06/14(Sun) 09:38:22

Re: 変数を増やす / keropi
evalと配列、とても勉強になりました、両方使えて巾が広がりました。
print eval("a"+(3+2))+a[3+2]
お二方とも、お休みの所、ありがとうございました。

No.882 2020/06/14(Sun) 11:41:31
VALについてお教えください。 / ながいも
バーコードを読み取るとQ0000****.00と表示がされます。
Qはbitweenで消せますし、INTで.00は取れるのですが
****が1桁の数字だったり4桁の数字だったりし、どのように0を削除して良いのかわかりません。
初歩的な質問で申し訳ございません。
お教え頂ければ幸いです。

No.873 2020/06/08(Mon) 20:11:58

Re: VALについてお教えください。 / ながいも
すいません。
勘違いのようでした。。。

No.874 2020/06/08(Mon) 20:22:53
文字列内の指定文字列の個数をカウントしたい / もじもじ
例えば「ABCCBACACBABACAB」といった文字列があります。
この中から「AB」がいくつあるかをカウントし変数に格納したいです。
どのように処理したらよいでしょうか。

No.870 2020/06/05(Fri) 21:22:40

Re: 文字列内の指定文字列の個数をカウントしたい / satocha
count=length(split("ABCCBACACBABACAB","AB"))-1

あとは
msgbox(count)
でも
print count
でもやって確認してください。

あまりに短いんで気づいたことを一つ。
UWSCの文字列処理は、英字の大文字、小文字を区別しません。
しかし、どういうわけかsplit関数の第二引数の文字列は区別するようです。

ほかのUWSCの文字列処理と合わせるなら、比較する前に、文字列、キーとも大文字化しておくといいです。

No.871 2020/06/06(Sat) 13:36:20

Re: 文字列内の指定文字列の個数をカウントしたい / もじもじ
satochaさん
ありがとうございました。助かりました。

No.872 2020/06/06(Sat) 17:24:16
SPLITがだめなのでしょうか・・・ / ながいも
お世話になっております。
データテーブル内の注文番号を抜き出す処理においてエラーが発生いたします。
エラー発生箇所はT2_DATAです。
REPEAT/UNTILの間に入れているからだとおもいますが何か良い方法はございますでしょうか?
初歩的な質問で申し訳ありません。
お助けいただけますようお願いいたします。

*******************************
TBL_CTR = 0
REPEAT
DE_DATA=DATA_TBL[TBL_CTR]

T0_DATA=BETWEENSTR(DATA_TBL[TBL_CTR],,) //1行まるごと抜き取り
T1_DATA=SPLIT(T0_DATA,",") //行をSPLITで分割
T2_DETA=T1_DATA[0] //1番先頭にいる注文番号を取りたい
T_DATA= BETWEENSTR(T2_DETA,"<#DBL>","<#DBL>") //ダブルクォーテーションが邪魔だから消す

DE_DATA=DATA_TBL[TBL_CTR]
IFB (SCAN=T_DATA )
TBL_CTR=LIST
ELSE
TBL_CTR = TBL_CTR + 1
ENDIF
UNTIL TBL_CTR + 1 > LIST

No.859 2020/06/02(Tue) 15:05:30

Re: SPLITがだめなのでしょうか・・・ / stuncloud
なんのエラーが出てますか?なるべくエラーメッセージもそのまま書いてください
なんとなくT0_DATAが長さ0の文字列だとだめになりそうな気がします
(長さ0の文字列splitすると長さ0のsafearrayになったような記憶
長さ0の配列だと[0]すらないのでエラーになる)

No.860 2020/06/02(Tue) 18:01:51

Re: SPLITがだめなのでしょうか・・・ / ながいも
stuncloud さん
お世話になっております。

variant or safe array index out of bounds
T2_DETA=T1_DATA[0]

というエラーでした。

仮で下記のように1と与えてみても同じエラーとなります。
variant or safe array index out of bounds
T2_DETA=T1_DATA[1]

*******************************
TBL_CTR = 1
REPEAT
DE_DATA=DATA_TBL[TBL_CTR]

T0_DATA=BETWEENSTR(DATA_TBL[TBL_CTR],,) //DATA_TBLから1行まるごと抜き取り
T1_DATA=SPLIT(T0_DATA,",") //行をSPLITでカンマ区切りで分割
T2_DATA=T1_DATA[1] //SPLITでカンマ区切りした1番先頭にいる注文番号を取りたい
T_DATA= BETWEENSTR(T1_DATA,"<#DBL>","<#DBL>") //ダブルクォーテーションが邪魔だから消す

DE_DATA=DATA_TBL[TBL_CTR]
IFB SCAN=T_DATA
TBL_CTR=LIST
ELSE
TBL_CTR = TBL_CTR + 1
ENDIF
UNTIL TBL_CTR + 1 > LIST

No.861 2020/06/02(Tue) 18:43:28

Re: SPLITがだめなのでしょうか・・・ / HIBI
T2_DATA だったり
T2_DETA だったりしてますが、単なる記述ミスですか?

No.862 2020/06/02(Tue) 18:49:18

Re: SPLITがだめなのでしょうか・・・ / ながいも
HIBIさん
お世話になっております。
単なる記述ミスです。。。すいません
記述ミスはエラーには関係がなさそうです。
お助けください。

No.863 2020/06/02(Tue) 18:54:34

Re: SPLITがだめなのでしょうか・・・ / ながいも
なおこっちでは問題なく動くのですがデータテーブル全体をPOSで
総当たりしてるからダメだと言われたための修正です。。。


for i = 1 to length(DATA_TBL)-1
ifb POS(SCAN,DATA_TBL[i]) > 0 then
print DATA_TBL[i]
SCANLINE =BETWEENSTR(DATA_TBL[i],,)//これで対象となる1行は取れた
endif
next

ARR = SPLIT(SCANLINE,",")
注文ナンバー=ARR[0]

No.864 2020/06/02(Tue) 19:03:25

Re: SPLITがだめなのでしょうか・・・ / ながいも
もしかして。。。
多次元配列であれば行けるのでしょうか?

No.865 2020/06/02(Tue) 21:05:58

Re: SPLITがだめなのでしょうか・・・ / stuncloud
>variant or safe array index out of bounds
配列の添字が範囲外のエラーです
やはり配列の長さが0だったようですね
以下のような状態です

arr = split("", ",")
print length(arr) // 0

これだと要素(長さ)0の配列になるので、arr[0]とすると範囲外になります
(arr[0]とするには要素が最低1つ必要なので)
簡単に言えば要素0の配列にはどんな添字を入れてもエラーになっちゃいます

おそらく T0_DATA が空文字列になっているのでしょう
すると T1_DATA が要素0の配列になります
そういった場合は処理をしないように、例えば

T1_DATA=SPLIT(T0_DATA,",") //行をSPLITで分割
if length(T1_DATA) = 0 then
 continue
endif
T2_DETA=T1_DATA[0] //1番先頭にいる注文番号を取りたい

のようにして続く処理を行わないようにしましょう

それと細かいとこですが
> T0_DATA=BETWEENSTR(DATA_TBL[TBL_CTR],,) //1行まるごと抜き取り
一行まるごとならbetweenstrは不要ですね

No.866 2020/06/02(Tue) 22:13:30

Re: SPLITがだめなのでしょうか・・・ / stuncloud
なお、前回書いたモジュールを使えばこんな風に記述できます


call Module_CSV.uws

// 略

CSV.OpenFile(filepath, FALSE) // csvファイルを読み込む

rows = length(CSV.GetTable()) // csvの行数を得る

// 1行ずつ処理
for i = 1 to rows
 T2_DATA = CSV.GetValue(i, 1) // i行目の1列目の値を得る
 // 残りの処理
next

No.867 2020/06/02(Tue) 22:28:03

Re: SPLITがだめなのでしょうか・・・ / ながいも
stuncloudさん
丁寧なご説明を頂きありがとうございました。
コンテニューで数値が入るまで戻る必要があったのですね。
早速明朝にプログラムを見直してみます。

前回頂いたCSVuwsは、私が使いたいCSVファイルにそのまま使えましたが、コピペだけでは成長出来ないと泣く泣く今回は使わないようにしておりました。

明朝にどはまりするようであればモジュールデータをそのまま利用させて頂きます。

度々御指南頂きありがとうございます。

No.868 2020/06/03(Wed) 00:39:43

Re: SPLITがだめなのでしょうか・・・ / ながいも
stuncloudさん
お世話になっております。
ご指南いただいたおかげでようやく前にすすめることができました。
SPRITなんか使ってるからだ!BETWEEN使えと言っていた先輩にSPLITでもわるくないんですと言い返せすことができました。
本当にありがとうございました。

*******************************
TBL_CTR = 0
REPEAT
DE_DATA=DATA_TBL[TBL_CTR]
T1_DATA=SPLIT(DE_DATA,",") //行をSPLITで分割
IF LENGTH(T1_DATA) = 0 THEN
TBL_CTR = TBL_CTR + 1
CONTINUE
ENDIF

注文ナンバー=(T1_DATA[0]) //1番先頭にいる注文番号を取りたい
部品コード=(T1_DATA[1])
部品名称=(T1_DATA[2])

注文ナンバー1= BETWEENSTR(注文ナンバー,"<#DBL>","<#DBL>") //ダブルクォーテーションを消す

DE_DATA=DATA_TBL[TBL_CTR]
IFB SCAN=注文ナンバー1
TBL_CTR=LIST
ELSE
TBL_CTR = TBL_CTR + 1
ENDIF
UNTIL TBL_CTR + 1 > LIST

No.869 2020/06/03(Wed) 09:57:55
Whileの挙動がおかしい。 / かぢゅ
while 1
 KBD(VK_F9,CLICK,400)
 IFB !CHKIMGX(ImageName, WindowID, x1, y1, x2, y2, d, td, tc)
 else
  MSGBOX("????????????????")
  break
 endif
Wend

というようなwhile処理を書いています。
画像認証自体は成功しているのですが、
認証してbreakしているにも関わらずF9キーが押されます。

速度を遅くすれば正しい動きをしますが、
400msのループでは余計にキーが押されてる状態です。

早いから止まらずもう一周しちゃうなんて、
プログラムとして致命的じゃないですか?

No.845 2020/05/31(Sun) 18:42:54

Re: Whileの挙動がおかしい。 / stuncloud
> 早いから止まらずもう一周しちゃうなんて、
> プログラムとして致命的じゃないですか?

そうですね、困りますね

僕はchkimgxを使ったことがないのでそちらを疑うということはできませんから、そこは問題ないものとします
ご質問の状況ですとmsgboxのダイアログを閉じた後にF9が押された、ということで間違いはないでしょうか
そうでなかった場合はchkimgx成功後にどのようにF9が押されたことを確認したのかを教えて下さい

それと以下のようにコードを修正した場合に現象を回避できるかも試してみてください

KBD(VK_F9,CLICK,400)
while 1
 IFB !CHKIMGX(ImageName, WindowID, x1, y1, x2, y2, d, td, tc)
  KBD(VK_F9,CLICK,400)
 else
  MSGBOX("????????????????")
  break
 endif
Wend

僕もwhileの挙動について調べてみようと思います
もし問題があった場合はumiumiさんでないと根本の解決ができませんが、コードの書き方でどうにかできるのであればそのノウハウを残しておきたいですし

# かなり前のバージョンですが、ループとtryの組み合わせで致命的な不具合があったのを思い出しますね

No.846 2020/05/31(Sun) 22:34:35

Re: Whileの挙動がおかしい。 / かぢゅ
stuncloudさん、レスありがとうございます。

結論から書くと、残念ながら変わりませんでした。
挙動としては、画像認証成功後ブレイクで処理終了するのが理想ですが、
F9キー押下→画像認証成功→アラート表示→F9キー押下となります。

アラート表示した時点で一切の処理を終了したいのです。

No.847 2020/05/31(Sun) 23:45:41

Re: Whileの挙動がおかしい。 / stuncloud
なるほど
正直なんとも言えませんね
実のところ100%かぢゅさんの勘違いだと思っているのですが、明日にでも動作を確認してみようと思います

最後に一つだけ確認したいのですが、ここに書かれたコードで現象が再現するんですよね?ほかにも色々書かれているけど端折っているということはないですよね?
もし違うなら再現するコードをください

以下は自分用メモです

おそらく状況としては
F9を押すと画面が変化する
変化した画面に対してchkimgxを行う
というようなことだと思われる

ぱっと見で正常動作しない要素はないのでchkimgxの挙動か、あるいはkbd()になにか落とし穴がある?

No.848 2020/06/01(Mon) 01:22:20

Re: Whileの挙動がおかしい。 / かぢゅ
端折っているところはあります。
下記全コードになります。

私も勘違いなのかなーと思うんですがね・・・。

------------------------------------
CALL ChkImgX.uws

in = "256.bmp"
wid = 0
x1 = 1340
y1 = 360
x2 = 1460
y2 = 400
d = 1
td = 5
tc = -1

startup_chkimgx()

KBD(VK_F9,CLICK,400)
while 1
IFB !CHKIMGX(in, wid, x1, y1, x2, y2, d, td, tc)
KBD(VK_F9,CLICK,400)
else
MSGBOX("????????????????")
break
endif
Wend
------------------------------------

1、F9キーを押して画面再描画
2、画像認証を行う
3、対象の画像があればアラートを表示し、処理終了

No.849 2020/06/01(Mon) 08:01:59

Re: Whileの挙動がおかしい。 / しろまさ
状況は少し違いますが、長押キーがスタックされ予期しない動作を起こした記憶があります。
対策は判断する直前に空のGetKeyState()を入れ、キーの記憶を解除していました。

以上を踏まえて試しに、Break直前にGetKeyState(VK_F9)を入れるとどうなりますか?

No.850 2020/06/01(Mon) 08:52:54

Re: Whileの挙動がおかしい。 / かぢゅ
結果は変わらず、F9キーが余計に押されてしまう状態ですね・・・。
No.851 2020/06/01(Mon) 12:21:37

Re: Whileの挙動がおかしい。 / しろまさ
F9は何のために押してるのかの確認です。 
KBD(VK_F9,CLICK,400) は強制的に F9 を押す命令ですが、
押した F9 はどのように作用しているのかがコードからは読み取れません。

> F9キー押下→画像認証成功→アラート表示
この文章の解釈は 「F9 を押すことで画像認識を発動させたい」ということでしょうか?
もしそうなら KBD(VK_F9,CLICK,400) ではなく

Ifb GetKeystate(VK_F9)
 IFB !CHKIMGX(ImageName, WindowID, x1, y1, x2, y2, d, td, tc)

なのかな?と思いました。

No.852 2020/06/01(Mon) 13:22:08

Re: Whileの挙動がおかしい。 / かぢゅ
とあるアプリケーションで利用します。

例えるなら
F9キーを押下することでランダムで画像が表示される。
その画像が、目的の画像だった場合のみアラートを表示させて処理を停止したい。

ということです。

目的の画像じゃなかった場合は、再度F9キーを押下したいのです。

現状は目的の画像を発見し、処理終了するものの
最後にもう一度F9キーがおされてしまい、画像が目的のものから変わってしまいます。

No.853 2020/06/01(Mon) 15:18:13

Re: Whileの挙動がおかしい。 / しろまさ
多分ですが、
?@ (誰かorUWSCにより) F9 が押される
?A UWSCの CHKIMGX() が実行される(評価はFALSE)
?B アプリ側の画像が切り替わる
?C UWSCにより F9 が押される
という順番で流れていると思われます(?B?Cの前後は未保証)

F9の後、アプリ側の画像が切り替わったら(もしくはSleep)という条件判断が無いと、
UWSCの実行が早すぎて評価が先に終わっている(もしくは2度評価されてる)のではないかと考えられます。

No.854 2020/06/01(Mon) 16:50:07

Re: Whileの挙動がおかしい。 / stuncloud
調べました
結論から言うと

コードは正常動作してるけど、受け側でF9入力の処理が余分に行われている

だと思われます

以下検証コード
https://gist.github.com/stuncloud/8f182060413cf7b4f9d43a331765a224

msgbox()が出る瞬間からその直前くらいで画像がまた変化することがありました (現象再現、頻度はわりと高め)
そのときのprintログを見るとmsgbox()を出したあとにUWSCからF9を押した形跡はありませんでした
なのでコード側が余計にkbd()を実行したわけではないと言えます

ですが、このままだと不都合なので対策を考えていきましょう

ひとまずkbd()が怪しいのかな?ということでそこをsckey()に変更してみました
するとどうやら現象が発生しない様子 (20回くらいやっても全く発生しない)
ので、ひとまずkbd()→sckey()の修正で様子を見てもらえないでしょうか

No.855 2020/06/01(Mon) 16:50:38

Re: Whileの挙動がおかしい。 / かぢゅ
while 1
 SLEEP(0.2)
 SCKEY(0,VK_F9)
 IFB !CHKIMGX(in, wid, x1, y1, x2, y2, d, td, tc)
 else
  MSGBOX("????????????????")
  break
 endif
Wend

これで思ったような挙動になるのを確認できました!
お二人とも、ありがとうございました!

No.856 2020/06/01(Mon) 17:08:47

Re: Whileの挙動がおかしい。 / stuncloud
画像名ランダム生成してたけど順番に変更していけば100%再現した…
なんにせようまくいってよかったです
kbd()とsckey()だと何が変わるんでしょうね?

No.857 2020/06/01(Mon) 17:14:15

Re: Whileの挙動がおかしい。 / しろまさ
>kbd()とsckey()だと何が変わるんでしょうね?
処理が重い(より時間が掛かる)とか?

No.858 2020/06/01(Mon) 19:27:18
token / kevens
お世話になります、以下、エラーになります、やりたことは、重複文字を消して、1つづつ取り出したいのですが、ご教示ください。

奇数 = 1,3,3,7,11,11,13,"aa","aa"
a1=Token(", ",奇数, True)
a2=Token(", ",奇数, True)
a3=Token(", ",奇数, True)
a4=Token(", ",奇数, True)
a5=Token(", ",奇数, True)
a6=Token(", ",奇数, True)

取り出したいもの
a1=1
a2=3
a3=7
a4=11
a5=13
a6=aa

No.841 2020/05/30(Sat) 19:59:54

Re: token / stuncloud
tokenは文字列を切り出すものです、なので

奇数 = "1,3,3,7,11,11,13,aa,aa"

のようにしないといけません

今回のようなケースで文字列を分割するならtokenよりsplitのほうが扱いやすいと思います
重複排除の定番はhashtblを用いた方法ですね、これに関しては過去ログにいくつかサンプルがあるはずです

No.842 2020/05/30(Sat) 22:49:01

Re: token / kevens
stuncloud様、いつも的確な回答、恐れ入ります、悩んでいたことがあっさりで、涙でそうです、ありがとうございました。
No.844 2020/05/31(Sun) 07:46:11
ファイルの中身を読み込んだテーブルの取り扱い / ながいも
連日の投稿失礼いたします。
皆様のおかげで少しずつですが完成に近づいてまいりました。
重ねて御礼申し上げます。

今回お伺いしたい内容はメモリテーブルに保存されている
CSVファイルの抜き取り方についてご助言をいただきたく思い
投稿させていただきました。
旧タイプではFOPENの戻値のFIDでCSVの行を把握し、注文番号以外の
部品名などの情報も列に+1とかすれば簡単に吸い出せました。

ところメモリテーブルに変更となると
ん?
FGET使えない?
メモリテーブルってファイルじゃないのにFOPENできませんよね?

中身のCSVをBETWEENで,ごとに抜き取るしかないのでしょうか?

**************************************************************
旧タイプ
SCAN = Input("注文番号をスキャンして下さい", "", FALSE, 200, 200)
列 = 1 //1列目に注文番号があるの1列目で検索
行 = 1
WHILE SCAN <> FGET(ID,行,列)
行 = 行 + 1
WEND
**************************************************************

**************************************************************
BETWEENタイプ
SCAN = Input("注文番号をスキャンして下さい", "", FALSE, 200, 200)
for i=0 to LIST//LISTはF_LINECOUNTで取得した最終行
SCANLINE =BETWEENSTR(DATA_TBL[i],,)//対象となる1行は取れた
next
**************************************************************

No.839 2020/05/29(Fri) 18:40:34

Re: ファイルの中身を読み込んだテーブルの取り扱い / stuncloud
csvの各行をsplit()で配列にすると扱いやすいでしょう

// 1行目の2列目の値を表示
row = split(DATA_TBL[0], ",") // 1行目なので添字は0
print row[1] // 2列目なので1

で、そういったことをやってくれるモジュールを書いてみました
メモリに格納したCSVのテーブルから、任意の行と列で値を抜き出せるようにしています
参考にしてみてください
https://gist.github.com/stuncloud/157e6a040fcde2a1a8e4195e53c4893e
Module_CSV.uwsが本体です、callして使います
Sample.uwsが実際にモジュールを使っているサンプルです
Test.csvがサンプルで読み込んでいるCSVファイルです

これをそのまま使っていただいても大丈夫ですよ
ただし厳密なCSV対応はできていないので予期せぬ結果になる場合があります

No.840 2020/05/30(Sat) 03:34:55

Re: ファイルの中身を読み込んだテーブルの取り扱い / ながいも
stuncloudさん
ありがとうございます。
早速スプリット関数なるものを使わせて頂きます。

No.843 2020/05/31(Sun) 00:01:31
テーブルという考えについてお教えください。 / ながいも
たびたびすいません。
先ほどFOPENについてご質問した際に一緒にに聞けばよかったのですがまたまた難題が。。。

CSVファイルをファイル開いたままで検索させずに、メモリテーブルに保存させ、PROCEDUREで組んだファイルのどこからでも呼び出せるようにしろと上長から言われました。
折角FOPENでわかったのに。。。と泣き言を言ってもいられないので

先ほどのFOPENの後に下記のようなものをいれると
次元数が異なるなどエラーが出てしまいます。
恐らくまた初歩的なミスなのだとおもいますがさっぱりです。
お助けいただけますようお願いいたします。


*********************************
PUBLIC LIST
PUBLIC FID
PUBLIC DATA_TBL
DIM DATA_TBL[LIST]
for i = 2 to LIST 
SETCLEAR(DATA_TBL[i])
DATA_TBL[i] = FGET(fid,i)  
next
FCLOSE(FID)
fend
for i=0 to list
print DATA_TBL[i]//ここではCSVを読める。
NEXT

Procedure 通常出荷
for i=0 to list
print DATA_TBL[i]//ん?パブリックでdata_tblって作ったのに?
NEXT
SCAN = Input("注文番号をいれて下さい", "", FALSE, 200, 200)
列 = 1 //1列目に注文番号があるの1列目で検索
行 = 1
WHILE SCAN <> FGET(DATA_TBL,行,列)//ここで次元数がと言われます。
行 = 行 + 1
IFB 行 > LIST
FUKIDASI("検索文字列はありません",50,100,0,30)
SOUND("Beep")
Exit
fend

No.833 2020/05/28(Thu) 15:10:06

Re: テーブルという考えについてお教えください。 / stuncloud
興味深い

問題点ははっきりしています
> PUBLIC DATA_TBL
> DIM DATA_TBL[LIST]

ここですね
これでpublic変数のDATA_TBLと、配列のDATA_TBL[]が別々に宣言されています(※詳細は末尾で)

なので 通常出荷() 内のDATA_TBLはpublic変数のそれになる(配列ではない)ため、次元数のエラーが出ます
配列をpublicにしておけば良いので、先程の2行を以下のように修正してください

PUBLIC DATA_TBL[LIST] // これ1行でOK

これで関数内からも配列DATA_TBL[]にアクセスできます


※ 検証コード

public hoge = "public variable"
dim hoge[] = "array"

print hoge[0] // array
fuga() // public variable

procedure fuga()
 print hoge
fend

同名の変数と配列を別々に定義できてるのがわかりますね
この仕様は知りませんでした

No.834 2020/05/28(Thu) 17:21:07

Re: テーブルという考えについてお教えください。 / ながいも
stuncloud さん
ご回答ありがとうございました。
DIM PUBLIC の混在のため次元エラーが発生していたことがわかりました。
早速修正してみたところ今度は配列エラーが出てしまいました。。。
UWSC難しすぎます。。。
とりあえず頑張ってググってみます。
次元エラーについてわかりやすい回答をいただきありがとうございました。

No.835 2020/05/28(Thu) 19:11:16

Re: テーブルという考えについてお教えください。 / しろまさ
> 配列エラーが出てしまいました。。。
解決しました?
最大数LIST個の配列はLIST番目の要素は存在しないのですよ(0番スタートの為)

No.836 2020/05/29(Fri) 13:08:33

Re: テーブルという考えについてお教えください。 / Rayna
>>835 ながいも さん

 ながいも さんのスクリプトでは
 LISTの代入部分は書かれていないので推測なのですが
 変数、定数の初期化順は以下の通りなので
  http://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=pickup&no=487
 そこまわりで配列エラーが起きてるかもしれないです

 例えばこんなスクリプトを書けば同じ配列宣言で違う長さの配列が出来てしまいます

  Public nUBound
  nUBound = 9
  Dim aLocal[nUBound] // 代入された 9
  Public aGlobal[nUBound] // 変数(nUBound)初期値の EMPTY を 0 と解釈

  SetClear(aLocal, "aLocal Value"); SetClear(aGlobal, "aGlobal Value") // わかりやすいように配列を埋める

  // 最大添字の確認
  //  'nUBound = 9' としているので 9 が結果として出てほしい
  Print Length(aLocal)-1 // 9
  Print Length(aGlobal)-1 // 0

  Print aLocal[1] // 読み成功 'aLocal Value' と表示
  Print aGlobal[1] // 読み失敗、範囲外を読もうとしたのでエラー

  Sleep(10)

 上記スクリプトの宣言部分は内部では次の順番で実行されています

  Public nUBound
  Public aGlobal[nUBound] // 変数(nUBound)初期値の EMPTY を 0 と解釈
  nUBound = 9
  Dim aLocal[nUBound] // 代入された 9
   ...

 グローバル変数に初期値を設定して扱うときは初期化順にも注意が必要です
 配列の要素数が自分の得たい結果になっているかどうか確認してみてください

No.837 2020/05/29(Fri) 14:24:21

Re: テーブルという考えについてお教えください。 / ながいも
しろまささん

ご回答ありがとうございます。
しろまささんのアドバイスのおかげでCSVは最大件数で1000件程度のデータのためPUBLIC DATA_TBL[2000]と変数ではなく定数を設定することでとりあえずしのぎました。

Raynaさん
Lengthなんて初めてききました。
今回はCSVのデータであったのでLISTはF_LINECOUNTで取得してましたがこのような文字数の取り方もあるんですね。
記載いただいた情報で勉強をさせていただきます。
長文でのご指南ありがとうございました。

No.838 2020/05/29(Fri) 18:06:25
fopenについてお教えください / ながいも
おせわになります。
下記のようなFOPENのプログラムでWORK_DATAというCSVファイルを開きたいのですが
DATA\というフォルダを指定するとファイルが開けません。
逆にフォルダ指定なしのTO_FILE = "C:\amazon依頼品出荷チェッカー\"だと開きます。
fopenで開けるフォルダの階層などはあるのでしょうか?


*********************************
TO_FILE = "C:\amazon依頼品出荷チェッカー\DATA\"
FILES = "WORK_DATA*"

for i=0 to GETDIR(TO_FILE, FILES,FALSE,3)-1
FID = FOPEN("<#DBL>" + GETDIR_FILES[i] + "<#DBL>")
NEXT
LIST = FGET(FID,F_LINECOUNT)
print FID
print LIST//開くファイルの行数をプリント

No.830 2020/05/28(Thu) 10:18:03

Re: fopenについてお教えください / しゅん
// 「C:\amazon依頼品出荷チェッカー\」にUWSファイルを置いているからです。
// カレントフォルダー以外のファイルを開こうとしていますので、FOPENのパス指定に注意してください。
// GETDIR_FILES[i]をPRINTしてみると良いでしょう
// あと、FOPENしたファイルは必ずFCLOSEしましょう


TO_FILE = "C:\amazon依頼品出荷チェッカー\DATA\"
FILES = "WORK_DATA*"

FID = -1
for i=0 to GETDIR(TO_FILE, FILES, FALSE, 3) - 1
  IF FID <> -1 THEN FCLOSE(FID)
  FID = FOPEN(TO_FILE + GETDIR_FILES[i])
NEXT
LIST = FGET(FID, F_LINECOUNT)
print FID
print LIST//開くファイルの行数をプリント

IF FID <> -1 THEN FCLOSE(FID)

No.831 2020/05/28(Thu) 12:07:24

Re: fopenについてお教えください / ながいも
しゅんさんへ
早速のご回答ありがとうございます。
2か月前より急にUWSCを扱う配置変更になったのですが上長があてにならないので独学で進めている中で本当に助かりました。
ありがとうございました。

No.832 2020/05/28(Thu) 13:32:04

以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ]

- HOME - お知らせ(3/8) - 記事検索 - 携帯用URL - フィード - ヘルプ - メール - 環境設定 -

- Skin: Modern v2.0 - Author: ロケットBBS -

Rocket Board Type-X (Free) Rocket BBS