标题:设置数据源的方法?
只看楼主
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
结帖率:91.53%
已结贴  问题点数:100 回复次数:14 
设置数据源的方法?
OPEN DATABASE "datas\材料管理"
currentUserID=2
runShouliaoForm()
SET DATABASE TO "材料管理"
CLOSE DATABASES

PROCEDURE runShouliaoForm
    PUBLIC  shouliaoForm
    shouliaoForm=CREATEOBJECT("m1Form")   
    shouliaoForm.show
    READ EVENTS
    RETURN
ENDPROC

DEFINE CLASS m1Form as myForm
    ADD OBJECT zhangdanLabel as label
    ADD OBJECT slrqLabel as label   
    ADD OBJECT gydwCbx as comboBox
    PROCEDURE load
        IF !USED("收料明细")
            USE "收料明细" IN 2
        ENDIF
        IF !USED("供应单位")
            USE "供应单位" IN 7
        ENDIF
    ENDPROC
   
    PROCEDURE myAddNew()
        ltCurrTime=DATETIME()
        this.zhangdanLabel.caption='S1'+STRTRAN(STRTRAN(STRTRAN(TTOc(ltCurrTime),':',''),'.',''),' ','')
        this.slrqLabel.caption=TTOc(ltCurrTime)
    ENDPROC
   
    PROCEDURE myQuery()
        this.zhangdanLabel.caption=收料明细.收料单号
        this.slrqLabel.caption=TTOC(收料明细.收料时间)
        SELECT 单位全称 FROM 供应单位 WHERE 供应编号=;
        (select 供应单位 from 收料明细 where 收料单号=this.zhangdanLabel.caption) INTO ARRAY tempA1
        thisform.gydwCbx.value=tempA1()

    ENDPROC
   
    PROCEDURE gydwCbx.init
        thisform.gydwCbx.controlSource=供应单位
        thisform.gydwCbx.rowSourceType=6
        thisform.gydwCbx.rowSource='供应单位.单位全称'

    ENDPROC
   
    PROCEDURE init
        SELECT "收料明细"
        GO BOTTOM
        IF BOF()
            MESSAGEBOX("数据库是空的!现在进入添加状态!",64)
            this.queryMode=.f.
            this.myAddNew()
        ELSE
            this.queryMode=.t.
            SELECT "收料明细"
            GO BOTTOM
            SKIP -1
            this.myQuery()
        ENDIF
    ENDPROC
   
    PROCEDURE unload
        IF USED("收料明细")
            USE IN "收料明细"
        ENDIF
        IF USED("供应单位")
            USE IN "供应单位"
        ENDIF
    ENDPROC
ENDDEFINE

设置下拉列表框的数据源是“供应单位.单位全称”
并将根据“收料明细.收料单号”查询的单位全称,作为下拉列表框的当前显示值  

这需要怎么做呢?
搜索更多相关主题的帖子: PUBLIC 数据源 
2016-01-09 23:33
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:1 
可以在表单设计器中设置啊。

活到老,学到老! http://www. E-mail:hu-jj@
2016-01-10 06:44
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
回复 2楼 hu9jj
静态的设置  都知道啦   就是想知道动态的   怎么设置  

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-10 07:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:50 
以下是引用不懂才问在2016-1-9 23:33:00的发言:
设置下拉列表框的数据源是“供应单位.单位全称”
并将根据“收料明细.收料单号”查询的单位全称,作为下拉列表框的当前显示值  

这需要怎么做呢?

        这句不要
        **thisform.gydwCbx.controlSource=供应单位

        thisform.gydwCbx.rowSourceType=6
        thisform.gydwCbx.rowSource='供应单位.单位全称'

thisform.gydwCbx.value = 根据“收料明细.收料单号”查询的单位全称
2016-01-10 08:57
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
回复 4楼 吹水佬
感觉离成功又近了一步  。。。 
 




查询的显示出来了  但数据源还是不太对劲  差哪个属性没设好?

程序代码:
    PROCEDURE myAddNew()
        ltCurrTime=DATETIME()
        this.zhangdanLabel.caption='S1'+STRTRAN(STRTRAN(STRTRAN(TTOc(ltCurrTime),':',''),'.',''),' ','')
        this.slrqLabel.caption=TRANSFORM(VAL(STRTRAN(STRTRAN(STRTRAN(TTOc(ltCurrTime),':',''),'.',''),' ','')),'9999年99月99日 99时99分99秒')
    ENDPROC
   
    PROCEDURE myQuery()
        this.zhangdanLabel.caption=收料明细.收料单号
        this.slrqLabel.caption=TRANSFORM(VAL(STRTRAN(STRTRAN(STRTRAN(TTOc(收料明细.收料时间),':',''),'.',''),' ','')),'9999年99月99日 99时99分99秒')
        SELECT 单位全称 FROM 供应单位 WHERE 供应编号=;
        (select 供应单位 from 收料明细 where 收料单号=this.zhangdanLabel.caption) INTO ARRAY tempA1
            MESSAGEBOX(tempA1(1))
        thisform.gydwCbx.value=tempA1(1)
            MESSAGEBOX(thisform.gydwCbx.value)
    ENDPROC
   
    PROCEDURE gydwCbx.init
        &&thisform.gydwCbx.controlSource=供应单位
        thisform.gydwCbx.rowSourceType=6
        thisform.gydwCbx.rowSource="供应单位.单位全称"
    ENDPROC 

我是照着原来的登录框上的下拉列表框做的  不过  那个是写在类定义里  这和INIT时再赋值  有区别吗?
程序代码:
DEFINE CLASS loginCbx as ComboBox
    left=96
    top=84
    width=156
    height=24
    fontSize=12
    rowSource="授权用户.用户名"
    rowSourceType=6
   
    PROCEDURE InteractiveChange
    &&LPARAMETERS nKeyCode&&, nShiftAltCtrl
        IF this.value<>''
            thisform.passwordCheck.setfocus
        ENDIF
    ENDPROC
   
ENDDEFINE 

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-10 14:55
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 5楼 不懂才问
因为同时用“供应单位”表作gydwCbx数据源和用“SELECT 单位全称 FROM 供应单位.....”查询数据,这会使“供应单位”表的记录指针不好确定,要就在操作前保存记录指针,操作完后恢复记录指针,有点烦杂,无必要建议不采用。
gydwCbx数据源可以参考:https://bbs.bccn.net/viewthread.php?tid=460797&page=1#pid2545896
2016-01-10 16:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用不懂才问在2016-1-10 14:55:50的发言:

感觉离成功又近了一步  。。。 


還遠呢,你還沒掌握相關數據的流向,別人告訴你怎麽做,也是知其然而不知其所以然。

授人以渔,不授人以鱼。
2016-01-10 17:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:10 
用(SQL)查詢,出來的是臨時表,即從原來的那些數據表中提取拼合而新構建的一個表,數據是取到手了,但你綁定的是這個臨時表,控件上所指向的表記錄未必是原表上對應的記錄,那麽當你要依據控件指示查尋當時沒通過查詢抄過來的數據時,就必須返回原表正確的記錄上去取,那就要多一次定位行爲。這在代碼處理上實際上並不好做。説到底,你要明白,用(SQL)查詢得到的是“复印件”和“綜合報表”,不管你在這樣的文件上做什麽,都不是對原始的數據做動作,但你事實上往往是要對原始數據做動作,那麽,是否使用(SQL)查詢,就是首先要考慮的問題。

單純問如何綁定數據源,答案很簡單,但它是否適用於你的程序實際,又是另一回事。很多人提問,都是祇顧當前,一旦得到解燃眉之急的藥方,就迫不及待地説已得到“完美解決”。將來行不下去,又來討特效藥,殊不知如此下去,到積重難返,就是神仙也救不了,等待推倒重來而已。

授人以渔,不授人以鱼。
2016-01-10 17:20
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
rowSourceType=6的实验记录

首先  用代码创建表单  我是搞不定了  先用设计器来弄  找找问题的关键
原理什么的  不懂  设计器能搞出来的东西,理论上,代码创建的就应该能搞出来
如果一些东西只能在设计器上实现  比如设计器里表结构可以有普通索引  代码创建的就不行
那,这么不讲道理的原理  也不能怪我  不想知其所以然了  。。。

准备工具,新建个工程,一个库“材料管理”,一个表“供应单位”,三条记录

测试一:新建表单,设计器上添加一个组合框,rowSourceType=6,rowSource="供应单位.单位全称",,,运行

解决办法,一般书籍的示例中,是在form的init事件中加入如下代码:
OPEN DATABASE "材料管理"
IF !USED("供应单位")
    USE "供应单位" IN 7
ENDIF
我对第一步实验的分析:在设计器中设置了COMBOBOX的属性,相当于对它做DEFINE定义,而表单的INIT事件是在控件的INIT之后发生的,,,猜想,难道要先定义属性,再打开表?
产生第二步实验,把代码转移到表单的LOAD中,,,运行结果,可以,猜想没猜到关键。。。

继续第三步实验,上代码
程序代码:
comboBoxtest=CREATEOBJECT("testForm")
comboBoxtest.show
READ EVENTS
RETURN 

DEFINE CLASS testForm as Form
    showWindow=2
    ADD OBJECT testComboBox as comboBox WITH rowSourceType=6,rowSource="供应单位.单位全称"   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC   
ENDDEFINE 
运行结果和第一步一样

第四步实验,定义INIT
程序代码:
OPEN DATABASE "材料管理"
IF !USED("供应单位")
    USE "供应单位" IN 7
ENDIF 

comboBoxtest=CREATEOBJECT("testForm")
comboBoxtest.show
READ EVENTS
RETURN 

DEFINE CLASS testForm as Form
    showWindow=2
    ADD OBJECT testComboBox as comboBox WITH rowSourceType=6,rowSource="供应单位.单位全称"
    PROCEDURE load&&init
*!*            OPEN DATABASE "材料管理"
*!*            IF !USED("供应单位")
*!*                USE "供应单位" IN 7
*!*            ENDIF
    ENDPROC
    PROCEDURE Destroy
        IF USED("供应单位")
            USE IN "供应单位"
        ENDIF
        SET DATABASE TO "材料管理"
        CLOSE DATABASES
        CLEAR EVENTS
    ENDPROC
ENDDEFINE 
测试结果,放表单的init里还是不行,但放LOAD或者直接放在表单创建之前,就可以

一个表单,一个组合框,只打开一个表的程序  到这里应该算解决了  虽然说不准什么原理  但可以确定的顺序是  先打开表  再执行控件的定义,才能找到相应字段  。。。

但一表单,多个组合框,打开不同表  怎么办呢?

跟贴继续试验

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-10 22:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
上次給你示范過怎麽綁定數據源的

授人以渔,不授人以鱼。
2016-01-10 23:08



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




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

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