标题:vfp 自动找到每一颗物料的最新交易价格。 do max查询(存货表,日期,料号) ...
只看楼主
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
结帖率:100%
已结贴  问题点数:20 回复次数:8 
vfp 自动找到每一颗物料的最新交易价格。 do max查询(存货表,日期,料号)
很多时候我需要查询到物料的最新价格,其中包含有采购价、存货价、销售价、市场价等等很多很多。…………


没一张表我都会用同样的代码来实现查询功能。代码如下:

程序代码:


select * from 存货表 t1 rgiht join (select max(日期) 日期,料号 from 存货表 group by 2 ) t2 on t1.日期=t2.日期 and t1.料号=t2.料号



 


每次来一张新的表格,我都需要重复的编写这样的代码,有没有一种方法可以实现让我运行某一个小的程序,自动获取到这张表的最新价格。


可以变动的字段有:表的名字可能会有变动(例如:存货表、采购表、发票表、订单表等等)。日期字段也会改成不同的名字(例如:日期、期间、年等等)。其他的都无所谓。


如果程序可以直接写成为:   

do  查询(价格表,日期字段,料号)

然后可以实现查询价格表里里面,日期最大的时候的详细信息。查询的理论是:“找到每一颗物料的最新交易价格。”



[此贴子已经被作者于2018-5-4 22:26编辑过]

搜索更多相关主题的帖子: 最新 价格 max 查询 日期 
2018-05-04 22:09
丁春秋yxp
Rank: 4
等 级:贵宾
威 望:10
帖 子:239
专家分:287
注 册:2017-10-31
得分:0 
这个应该不难,我也常写几十行的小程序来实现某个功能。但你写的我看不懂,因为我不熟悉select语句。
2018-05-04 22:55
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
select * from 存货表 t1 ;
inner join (select max(日期) as 日期,料号 from 存货表 group by 料号 ) t2 on t1.日期=t2.日期 and t1.料号=t2.料号;
where t1.料号 = allt(thisform.text1.value) &&
收到的鲜花
  • hyz000012018-05-05 12:09 送鲜花  1朵   附言:谢谢解答
2018-05-04 23:06
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
得分:0 
以下是引用mywisdom88在2018-5-4 23:06:41的发言:

select * from 存货表 t1 ;
inner join (select max(日期) as 日期,料号 from 存货表 group by 料号 ) t2 on t1.日期=t2.日期 and t1.料号=t2.料号;
where t1.料号 = allt(thisform.text1.value) &&



谢谢你的解答,一个一个的查询,我自己能搞定,需要的是知道怎么样可以编写一段子程序,然后通过运行子程序来获得新的表(新表内容为物料的最新交易价格。)而且这个子程序是一劳永逸的,可以实现不同表的最新交易价格查询。
2018-05-05 12:07
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:20 
*!* 测试数据
SET CENTURY ON
SET DATE YMD
CREATE CURSOR tt(序号 i,日期 d,物料 c(20),价格 n(10,2))

INSERT INTO tt(序号,日期,物料,价格) VALUES (1,{^2018-05-01},"电脑01",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (2,{^2018-05-02},"电脑01",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (3,{^2018-05-03},"电脑01",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (4,{^2018-05-01},"电脑02",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (5,{^2018-05-04},"电脑02",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (6,{^2018-05-06},"电脑02",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (7,{^2018-05-02},"电脑03",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (8,{^2018-05-05},"电脑03",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (9,{^2018-05-06},"电脑03",INT(RAND()*10))

* BROWSE



LOCAL tmp

tmp = GetMax("TT","日期","物料")
IF !EMPTY(tmp)
   SELECT (tmp)
   BROWSE
ELSE
   MESSAGEBOX("参数有问题")   
ENDIF
   

*!* 调用函数,参数正常时,返回非空值的临时表名称
FUNCTION GetMax(cTableName,cDateField,cGroupField)
 LOCAL tmp_TableName,cSql
 tmp_TableName = ""
 cSql = ""
 *!* 检测源表
 IF TYPE("cTableName") = "C"  AND USED(cTableName) AND TYPE("cDateField") = "C" AND TYPE("cGroupField") = "C"
    tmp_TableName = LOWER("tmp"+SYS(2015))
    TEXT TO cSql TEXTMERGE NOSHOW PRETEXT 4
     SELECT t1.* FROM <<cTableName>> AS t1 ;
      RIGHT JOIN (SELECT MAX(<<cDateField>>) AS <<cDateField>> ,<<cGroupField>> FROM <<cTableName>> GROUP BY <<cGroupField>>) AS t2 ;
      ON t1.<<cGroupField>> = t2.<<cGroupField>> and t1.<<cDateField>> = t2.<<cDateField>> ;
      INTO CURSOR <<tmp_TableName>> READWRITE ;
      ORDER BY t1.<<cGroupField>>
    ENDTEXT
*   messagebox(cSql) &&观察生成的SQL语句对不对
    EXECSCRIPT(cSql)
 ENDIF
 RETURN tmp_TableName
ENDFUNC

[此贴子已经被作者于2018-5-5 14:04编辑过]

2018-05-05 13:53
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
只有想不到,没有做不到

坚守VFP最后的阵地
2018-05-05 19:54
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
学习啦,谢谢!
2018-05-05 20:43
hyz00001
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:137
注 册:2012-10-5
得分:0 
以下是引用mywisdom88在2018-5-5 13:53:13的发言:

*!* 测试数据
SET CENTURY ON
SET DATE YMD
CREATE CURSOR tt(序号 i,日期 d,物料 c(20),价格 n(10,2))

INSERT INTO tt(序号,日期,物料,价格) VALUES (1,{^2018-05-01},"电脑01",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (2,{^2018-05-02},"电脑01",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (3,{^2018-05-03},"电脑01",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (4,{^2018-05-01},"电脑02",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (5,{^2018-05-04},"电脑02",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (6,{^2018-05-06},"电脑02",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (7,{^2018-05-02},"电脑03",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (8,{^2018-05-05},"电脑03",INT(RAND()*10))
INSERT INTO tt(序号,日期,物料,价格) VALUES (9,{^2018-05-06},"电脑03",INT(RAND()*10))

* BROWSE



LOCAL tmp

tmp = GetMax("TT","日期","物料")
IF !EMPTY(tmp)
   SELECT (tmp)
   BROWSE
ELSE
   MESSAGEBOX("参数有问题")   
ENDIF
   

*!* 调用函数,参数正常时,返回非空值的临时表名称
FUNCTION GetMax(cTableName,cDateField,cGroupField)
 LOCAL tmp_TableName,cSql
 tmp_TableName = ""
 cSql = ""
 *!* 检测源表
 IF TYPE("cTableName") = "C"  AND USED(cTableName) AND TYPE("cDateField") = "C" AND TYPE("cGroupField") = "C"
    tmp_TableName = LOWER("tmp"+SYS(2015))
    TEXT TO cSql TEXTMERGE NOSHOW PRETEXT 4
     SELECT t1.* FROM <<cTableName>> AS t1 ;
      RIGHT JOIN (SELECT MAX(<<cDateField>>) AS <<cDateField>> ,<<cGroupField>> FROM <<cTableName>> GROUP BY <<cGroupField>>) AS t2 ;
      ON t1.<<cGroupField>> = t2.<<cGroupField>> and t1.<<cDateField>> = t2.<<cDateField>> ;
      INTO CURSOR <<tmp_TableName>> READWRITE ;
      ORDER BY t1.<<cGroupField>>
    ENDTEXT
*   messagebox(cSql) &&观察生成的SQL语句对不对
    EXECSCRIPT(cSql)
 ENDIF
 RETURN tmp_TableName
ENDFUNC



就是这个效果,你是怎么样做到的,真厉害。
2018-05-07 14:10
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
*  messagebox(cSql) &&观察生成的SQL语句对不对
你看看输出,是不是你要的就可以了,然后,慢慢1条条看


*也可以改成这样
*!* 调用函数,参数正常时,返回非空值的临时表名称
FUNCTION GetMax(cTableName,cDateField,cGroupField)
  LOCAL tmp_TableName,cSql
  tmp_TableName = ""
  cSql = ""
  *!* 检测源表
 IF TYPE("cTableName") = "C"  AND USED(cTableName) AND TYPE("cDateField") = "C" AND TYPE("cGroupField") = "C"
     tmp_TableName = LOWER("tmp"+SYS(2015))
     cSql = "SELECT t1.* FROM " + cTableName + " AS t1"
     cSql = cSql + " RIGHT JOIN (SELECT MAX(" + cDateField + ") AS " + cDateField + "," + cGroupField + " FROM " + cTableName + " GROUP BY " + cGroupField + ") AS t2"
     cSql = cSql + " ON t1." + cGroupField + "= t2."+ cGroupField +" and t1." + cDateField + " = t2." + cDateField
     cSql = cSql + " INTO CURSOR " + tmp_TableName +" READWRITE"
     cSql = cSql + " ORDER BY t1." + cGroupField

 *   messagebox(cSql) &&观察生成的SQL语句对不对
    EXECSCRIPT(cSql)
  ENDIF
  RETURN tmp_TableName
 ENDFUNC

[此贴子已经被作者于2018-5-7 15:32编辑过]

2018-05-07 15:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486638-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.285775 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved