注册 登录
编程论坛 VFP论坛

求助VBA转为VFP

sostemp 发布于 2023-07-09 13:40, 1731 次点击

Function get_trace_json(mystring As String) As Integer
    Dim objJSx, objJSy As Object
    Set objJSx = CreateObject("ScriptControl")         
objJSx.Language = "JavaScript"                    
    jscode = "function json(s,i) { return eval('(' + s + ').traces[' + i + ']'); }"
    objJSx.AddCode jscode
    For n = 1 To 80
        If objJSx.Run("json", mystring, n - 1) = "" Then Exit For
        Set objJSy = objJSx.Run("json", mystring, n - 1)
        stime(n) = objJSy.acceptTime
        saddr(n) = objJSy.acceptAddress
        state(n) = objJSy.remark
        Debug.Print n & ":" & objJSy.acceptTime & objJSy.acceptAddress & objJSy.remark
    Next n
   
    If Left(state(n - 1), 2) = "妥投" Or Left(state(n - 1), 5) = "投递并签收" Then tt = "OK"
get_trace_json = n – 1
End Function

Function get_trace_json1(mystring As String) As Integer
    Dim objJSx, objJSy As Object
 
    Set objJSx = CreateObject("ScriptControl")      
    objJSx.Language = "JavaScript"                  
    jscode = "var json=" & mystring & ";"            
    objJSx.AddCode (jscode)
    For n = 1 To 80
        jscode = "var json_tr=json.traces[" & n - 1 & "];"
        objJSx.AddCode (jscode)
        If objJSx.CodeObject.json_tr = "" Then Exit For
        Set objJSy = objJSx.CodeObject.json_tr
        stime(n) = CallByName(objJSy, "acceptTime", VbGet)
        saddr(n) = CallByName(objJSy, "acceptAddress", VbGet)
        state(n) = CallByName(objJSy, "remark", VbGet)
        Debug.Print n & ":" & objJSy.acceptTime & objJSy.acceptAddress & objJSy.remark
    Next n
   
    If Left(state(n - 1), 2) = "妥投" Or Left(state(n - 1), 5) = "投递并签收" Then tt = "OK"
    get_trace_json1 = n - 1
End Function
14 回复
#2
吹水佬2023-07-09 14:52
没看明白,代码不完整。
或者整一个大概意思的示例测试一下。
明白VBA在做什么,用VFP做出一样的结果就可以。

#3
sostemp2023-07-09 15:51
回复 2楼 吹水佬
谢谢,不好意思,发漏了点JSOn数据。
主要是用来解析下面JSON数据的两个不同方法的函数。

Json数据如下

TEXT TO cJson_test  TEXTMERGE NOSHOW PRETEXT 15
{"traces":[{"acceptTime":"2016-12-03 12:24:25","acceptAddress":"宿州市","remark":"宿州市邮政速递公司北区揽投部已收件(揽投员姓名:陆登杰,联系电话:18955780863)"},{"acceptTime":"2016-12-03 18:45:11","acceptAddress":"宿州市","remark":"离开宿州市 发往蚌埠市"},{"acceptTime":"2016-12-03 21:13:10","acceptAddress":"蚌埠市","remark":"到达蚌埠市处理中心(经转)"},{"acceptTime":"2016-12-03 21:14:29","acceptAddress":"蚌埠市","remark":"离开蚌埠市 发往南京市(经转)"},{"acceptTime":"2016-12-04 01:31:00","acceptAddress":"南京市","remark":"到达EMS航空集散中心(南京)处理中心(经转)"},{"acceptTime":"2016-12-04 06:34:00","acceptAddress":"南京市","remark":"离开南京市 发往北京市(经转)"},{"acceptTime":"2016-12-04 08:39:00","acceptAddress":"北京市","remark":"到达  中国邮政速递物流股份有限公司北京市邮件处理中心(航 处理中心"},{"acceptTime":"2016-12-04 11:22:04","acceptAddress":"北京市","remark":"离开中国邮政速递物流股份有限公司北京市国货航航空邮件处 发往北京邮政速递上地区域分公司清华营投部"},{"acceptTime":"2016-12-04 13:23:00","acceptAddress":"北京市","remark":"北京邮政速递上地区域分公司清华营投部安排投递,预计23:59:00前投递"},{"acceptTime":"2016-12-04 15:50:40","acceptAddress":"北京市","remark":"投递并签收,签收人:本人收"}]}
ENDTEXT
#4
nbwww2023-07-09 19:50
程序代码:
TEXT TO jsCode NOSHOW
  var data_1={"traces":[{"accepttime":"2016-12-03 12:24:25","acceptaddress":"宿州市","remark":"宿州市邮政速递公司北区揽投部已收件(揽投员姓名:陆登杰,联系电话:18955780863)"},{"accepttime":"2016-12-03 18:45:11","acceptaddress":"宿州市","remark":"离开宿州市 发往蚌埠市"},{"accepttime":"2016-12-03 21:13:10","acceptaddress":"蚌埠市","remark":"到达蚌埠市处理中心(经转)"},{"accepttime":"2016-12-03 21:14:29","acceptaddress":"蚌埠市","remark":"离开蚌埠市 发往南京市(经转)"},{"accepttime":"2016-12-04 01:31:00","acceptaddress":"南京市","remark":"到达EMS航空集散中心(南京)处理中心(经转)"},{"accepttime":"2016-12-04 06:34:00","acceptaddress":"南京市","remark":"离开南京市 发往北京市(经转)"},{"accepttime":"2016-12-04 08:39:00","acceptaddress":"北京市","remark":"到达  中国邮政速递物流股份有限公司北京市邮件处理中心(航 处理中心"},{"accepttime":"2016-12-04 11:22:04","acceptaddress":"北京市","remark":"离开中国邮政速递物流股份有限公司北京市国货航航空邮件处 发往北京邮政速递上地区域分公司清华营投部"},{"accepttime":"2016-12-04 13:23:00","acceptaddress":"北京市","remark":"北京邮政速递上地区域分公司清华营投部安排投递,预计23:59:00前投递"},{"accepttime":"2016-12-04 15:50:40","acceptaddress":"北京市","remark":"投递并签收,签收人:本人收"}]};
endtext   

js = CREatEOBJECt("ScriptControl")
js.Language = "JavaScript"
js.addCode(jsCode)
json = js.CodeObject.data_1

*!*    ?js.eval("data_1.traces")  

CREatE CURSOR tt (accepttime c(30), acceptaddress c(30), remark c(200))

m.oSon=js.CodeObject.data_1.traces  
FOR EACH m.i IN m.oSon
    INSERt INtO tt VaLUES (m.i.accepttime, m.i.acceptaddress, m.i.remark)
ENDFOR
SELECt * FROM tt
#5
nbwww2023-07-09 19:51
就是要注意要把JSON中字段名称转换为小写字母  不然出错
#6
sostemp2023-07-09 20:10
回复 4楼 nbwww
谢谢您的回复,结果会提取。
但想要的是转化那2 个vba,并不是要结果,是想学学对照转化。
#7
easyppt2023-07-10 14:25
以下是引用nbwww在2023-7-9 19:51:09的发言:

就是要注意要把JSON中字段名称转换为小写字母  不然出错


有个想法,不知道能否实现:
能不能先用 js 的正则表达式 查找和替换所有 字段属性的名称 为小写,然后 再正常用 js 解析啊?
这个 利用 js 正则表达式 替换 的代码,谁会写啊?
#8
sostemp2023-07-10 21:01
回复 7楼 easyppt
主要想要的是转化顶楼 2 个vba函数,目前未解决。
不是要获取结果,甚至用ⅴFP自带AIines都可提取结果。

JSOn数据只是供测试用,不过如何简洁高效通用的批替则是另一个知识点。
#9
吹水佬2023-07-10 21:58
其实与VBA关系不太,VFP也一样,到底也是调用JS脚本,两个函数实质没多大差别,只是表达方式有点不用,都是通过数组元素对象取数据。
#10
easyppt2023-07-11 15:26
请教:nbwww
这段代码:
m.oSon=js.CodeObject.data_1.traces  
FOR EACH m.i IN m.oSon
    INSERt INtO tt VaLUES (m.i.accepttime, m.i.acceptaddress, m.i.remark)
ENDFOR

如果不用  FOR EACH 方式,怎么取出数据?
? m.oSon.accepttime
? m.oSon(1).accepttime
? m.oSon.item(1)
尝试通过 对象、数组、集合  都提示语法错误,取不出。

#11
吹水佬2023-07-11 15:39
JS自定义的数组对象没有item属性,vfp解析不了。
既然都用到JS了,可行的话最好都交给JS去处理,vfp直接调用JS取数就好了,这样效率也高点。
#12
nbwww2023-07-11 18:54
回复 10楼 easyppt
    ?js.eval("data_1.traces["+ALLTRIM(STR(1))+"].remark")
先取.length  然后循环    你要的是这个意思?
#13
nbwww2023-07-11 18:58
程序代码:
TEXT TO jsCode NOSHOW
  var data_1={"traces":[{"accepttime":"2016-12-03 12:24:25","acceptaddress":"宿州市","remark":"宿州市邮政速递公司北区揽投部已收件(揽投员姓名:陆登杰,联系电话:18955780863)"},{"accepttime":"2016-12-03 18:45:11","acceptaddress":"宿州市","remark":"离开宿州市 发往蚌埠市"},{"accepttime":"2016-12-03 21:13:10","acceptaddress":"蚌埠市","remark":"到达蚌埠市处理中心(经转)"},{"accepttime":"2016-12-03 21:14:29","acceptaddress":"蚌埠市","remark":"离开蚌埠市 发往南京市(经转)"},{"accepttime":"2016-12-04 01:31:00","acceptaddress":"南京市","remark":"到达EMS航空集散中心(南京)处理中心(经转)"},{"accepttime":"2016-12-04 06:34:00","acceptaddress":"南京市","remark":"离开南京市 发往北京市(经转)"},{"accepttime":"2016-12-04 08:39:00","acceptaddress":"北京市","remark":"到达  中国邮政速递物流股份有限公司北京市邮件处理中心(航 处理中心"},{"accepttime":"2016-12-04 11:22:04","acceptaddress":"北京市","remark":"离开中国邮政速递物流股份有限公司北京市国货航航空邮件处 发往北京邮政速递上地区域分公司清华营投部"},{"accepttime":"2016-12-04 13:23:00","acceptaddress":"北京市","remark":"北京邮政速递上地区域分公司清华营投部安排投递,预计23:59:00前投递"},{"accepttime":"2016-12-04 15:50:40","acceptaddress":"北京市","remark":"投递并签收,签收人:本人收"}]};
endtext   
**********************************************注意要把JSON中的字段名称转换为小写**************************
js = CREatEOBJECt("ScriptControl")
js.Language = "JavaScript"
js.addCode(jsCode)
json = js.CodeObject.data_1

FOR i=0 TO json.traces.length-1
    ?js.eval("data_1.traces["+ALLTRIM(STR(i))+"].remark")
ENDFOR
#14
easyppt2023-07-11 21:24
谢谢 吹版 和 nbwww

明白了!
#15
金戈铁马22023-08-24 11:32
路过
1