标题:设置数据源的方法?
取消只看楼主
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
结帖率:91.53%
已结贴  问题点数:100 回复次数:7 
设置数据源的方法?
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
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
回复 2楼 hu9jj
静态的设置  都知道啦   就是想知道动态的   怎么设置  

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-10 07:59
不懂才问
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: 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
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
实验继续:
第五步:在库里另加一表“计量单位”,导入若干数据,表单另加一组合框,rowSource="计量单位.单位名称",rowSourceType=8
表单load多加一组打开“计量单位”的代码
测试运行,成功

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

DEFINE CLASS testForm as Form
    showWindow=2
    ADD OBJECT testComboBox1 as comboBox WITH rowSourceType=6,rowSource="供应单位.单位全称"
    ADD OBJECT testComboBox2 as comboBox WITH rowSourceType=6,rowSource="计量单位.单位名称",top=100,left=50
    PROCEDURE load
        OPEN DATABASE "材料管理"
        IF !USED("供应单位")
            USE "供应单位" IN 7
        ENDIF
        IF !USED("计量单位")
            USE "计量单位" IN 8
        ENDIF
    ENDPROC
    PROCEDURE Destroy
        IF USED("供应单位")
            USE IN "供应单位"
        ENDIF
        IF USED("计量单位")
            USE IN "计量单位"
        ENDIF
        SET DATABASE TO "材料管理"
        CLOSE DATABASES
        CLEAR EVENTS
    ENDPROC
ENDDEFINE 
测试运行  啥问题都没有  。。。。


那么  我之前的项目里  也是这样做的  为什么呢?

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-10 23:11
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
先不管为什么  继续  

程序代码:
myDrv=SYS(5)
myDir=SYS(2003)
myProgPath=myDrv+myDir
SET DEFAULT TO &myProgPath

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

DEFINE CLASS testForm as Form
    showWindow=2
    queryModel=.t.
    ADD OBJECT ComboBox1 as comboBox WITH rowSourceType=6,rowSource="供应单位.单位全称",top=30,left=50
    ADD OBJECT ComboBox2 as comboBox WITH rowSourceType=6,rowSource="计量单位.单位名称",top=100,left=50
    ADD OBJECT label1 as label WITH top=150,left=50,autoSize=.t.
    ADD OBJECT label2 as label WITH top=200,left=50,autoSize=.t.
    PROCEDURE load
        OPEN DATABASE "datas\材料管理"
        IF !USED("材料流水")
            USE "材料流水" IN 1
        ENDIF
        IF !USED("收料明细")
            USE "收料明细" IN 2
        ENDIF
        IF !USED("用料明细")
            USE "用料明细" IN 3
        ENDIF
        IF !USED("材料总计")
            USE "材料总计" IN 4
        ENDIF
        IF !USED("材料分类")
            USE "材料分类" IN 5
        ENDIF
        IF !USED("用途")
            USE "用途" IN 6
        ENDIF
        IF !USED("供应单位")   
            USE "供应单位" IN 7
        ENDIF
        IF !USED("计量单位")
            USE "计量单位" IN 8
        ENDIF
        IF !USED("保管地点")
            USE "保管地点" IN 9
        ENDIF
        IF !USED("单位人员")
            USE "单位人员" IN 10
        ENDIF
        IF !USED("所在部门")
            USE "所在部门" IN 11
        ENDIF
    ENDPROC
    PROCEDURE init
        SELECT "收料明细"
        GO BOTTOM
        IF BOF()
            MESSAGEBOX("数据库是空的!现在进入添加状态!",64)
            this.queryModel=.f.
            this.myAddNew()
        ELSE
            this.queryModel=.t.
            SELECT "收料明细"
            GO BOTTOM
            SKIP -1
            this.myQuery()
        ENDIF
    ENDPROC
    PROCEDURE myAddNew()
        ltCurrTime=DATETIME()
        this.label1.caption='S1'+STRTRAN(STRTRAN(STRTRAN(TTOc(ltCurrTime),':',''),'.',''),' ','')
        this.label2.caption=TRANSFORM(VAL(STRTRAN(STRTRAN(STRTRAN(TTOc(ltCurrTime),':',''),'.',''),' ','')),'9999年99月99日 99时99分99秒')
        =''
        =''
    ENDPROC
   
    PROCEDURE myQuery()
        this.label1.caption=收料明细.收料单号
        this.label2.caption=TRANSFORM(VAL(STRTRAN(STRTRAN(STRTRAN(TTOc(收料明细.收料时间),':',''),'.',''),' ','')),'9999年99月99日 99时99分99秒')
        SELECT 单位全称 FROM 供应单位 WHERE 供应编号=;
            (select 供应单位 from 收料明细 where 收料单号=this.label1.caption) INTO ARRAY tempArray
        =tempArray(1)
        =.t.
        SELECT 单位名称 FROM 计量单位 WHERE 计量编号=;
            (select 计量单位 from 材料总计 where 材料编号=;
                (SELECT 材料编号 FROM 收料明细 where 收料单号=this.label1.caption)) INTO ARRAY tempArray
        =tempArray(1)
        =.t.
    ENDPROC    
    PROCEDURE Destroy
        IF USED("材料流水")
            USE IN "材料流水"
        ENDIF
        IF USED("收料明细")
            USE IN "收料明细"
        ENDIF
        IF USED("用料明细")
            USE IN "用料明细"
        ENDIF
        IF USED("材料总计")
            USE IN "材料总计"
        ENDIF
        IF USED("材料分类")
            USE IN "材料分类"
        ENDIF
        IF USED("用途")
            USE IN "用途"
        ENDIF
        IF USED("供应单位")
            USE IN "供应单位"
        ENDIF
        IF USED("计量单位")
            USE IN "计量单位"
        ENDIF
        IF USED("保管地点")
            USE IN "保管地点"
        ENDIF
        IF USED("单位人员")
            USE IN "单位人员"
        ENDIF
        IF USED("所在部门")
            USE IN "所在部门"
        ENDIF
        SET DATABASE TO "材料管理"
        CLOSE DATABASES
        CLEAR EVENTS
    ENDPROC
ENDDEFINE

运行全OK,感觉逻辑上,没什么太错误啊

可为什么把这种逻辑用在我原来写好的程序界面里,就是不行呢?

真是蛋疼啊!!!!!!

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-11 00:31
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
崩溃中。。。

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-11 01:01
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
回复 10楼 TonyDeng
就是按上次示范做的啊   思路也没错  逻辑也清楚   但就是奇怪了   在我原来编写好的“界面”里实现数据功能  就是不行 。。。。

另建一个文件   文本文件比较器

右边对着左边输入一遍   看看哪里会错   。。。。。。

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-01-11 09:36



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




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

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