0

我需要编写一个程序,根据其中一个数据字段中提供的数字复制一些行。

每行包含一个名称/地址数据 && 一个数字,该数字表明该行必须复制多少次,如下例所示(4 是这个数字)

辛普森先生,纽约阳光街 20490 号,4
因此,此记录需要另外 3 个重复,总共 4 个,如下
:A Simpson, Sunshine Street 20490, New York, 4
Mr A Simpson, Sunshine Street 20490, New York, 4
Mr A Simpson, Sunshine Street 20490, New约克,4

程序要么在表格底部追加新记录,然后用相关数据填充它们(并对其进行排序,使重复项一个接一个),或者如果可能的话,在每一行之后制作一个重复项。我想这是要做阵列的事情,我一点也不熟悉,而且我已经花了几个小时才能完成。

非常感谢您的帮助。

4

3 回答 3

2

需要复制的数据是否附加到同一个表中?如果是这样,有几种技术可以尝试。

1:确保您在需要复制的行上,然后:

SCATTER MEMVAR    &&Save fields to memory varibles of the same name
APPEND BLANK      &&Adds a blank record to the end of the current table
GATHER MEMVAR     &&Adds the memory variables values to the appropiate columns

2:使用 INSERT 命令

SCATTER MEMVAR    &&Save fields to memory varibles of the same name
INSERT INTO myTableName FROM MEMVAR   &&Adds a record and populates the columns

至于获得您需要的重复数,例如您的示例中的 4,您可以在过滤后的表上执行循环,例如:

&&Get records that need dups processed. Add WHERE condition if needed.
SELECT * FROM myTableName INTO CURSOR myTemp  
SELECT myTemp
SCAN
    SCATTER MEMVAR
    FOR i = 1 TO m.CountFieldName
       INSERT INTO myTableName FROM MEMVAR
    ENDFOR
ENDSCAN

我还没有测试过代码,但它应该非常接近。

于 2013-02-01T15:16:50.140 回答
0

正如上面评论中提到的 Tamar,附加到同一个表中可能会导致递归结果。您可能会考虑将您的结果从原始表格放入“备用”工作区域,以执行任何最终操作(打印或其他),然后在完成后关闭。这样,原始条目保持不变,只需一个条目。

也就是说,基于重复,我将创建一个带有记录(或更多)的临时游标来模拟结果集......即:1 有 1 条记录,2 有 2,5 有 5......

create cursor C_TempNumbers ( int numMatch )
index on numMatch tag numMatch
for i = 1 to 10
   for j = 1 to i
      insert into C_TempNumbers ( numMatch ) values ( i )
   endfor
endfor

所以现在,我有一个表和索引,其中包含类似的记录

1
2
2
3
3
3
4
4
4
4

ETC..

现在,我将根据 numMatch 从连接到该游标的原始表中进行查询。如果只有 1,它将找到 1 条记录,返回 1 行。如果数字为 4,则返回 4 次。好消息...如果您有 20 个 4 条目、30 个 3 条目等...他们仍然会得到正确的计数。

select YT.*; 
   from YourOriginalTable YT ;
      join C_TempNumbers ;
         on YT.YourNumberColumn = C_TempNumbers.numMatch; 
   into cursor C_FinalResult readwrite

完成...您的决赛桌准备就绪,您的原件完好无损,没有将所有重复项放入其中。

于 2013-02-02T00:31:55.833 回答
0

谢谢两位,我们(我和我的同事)处理这个问题的方式有点不同,我会用一种更简单的方式说,因为我们远不是专家。我现在唯一的问题,我们需要处理的不是一个,而是其中两个字段(下面称为 hopa_gold 或 hwc_red)。因此,例如,如果一个读取“2”而另一个读取“3”,我们需要生成第一个的 1 个副本(总共制作两个)和另一个副本的两个(因此总共会产生三个)。这种情况不会经常发生,所以我认为如果有必要我们会“手工”完成。我们的(非常简单!)代码如下。第一行将字段更改为数字,否则它不起作用。请让我知道你的想法。干杯

ALTER table input alter hopa_gold n(10)
ALTER table input alter hwc_red n(10)
COUNT TO lastrec
Initval = 1
Varname = 1
trec = 1
GO top
replace ALL tnum WITH hopa_gold+hwc_red
GO top
FOR trec = 1 TO lastrec
    FOR VarName = Initval TO (tnum-1)  

      SCATTER MEMVAR 
      APPEND BLANK
      GATHER MEMVAR 

    ENDFOR
    GOTO trec + 1

ENDFOR
于 2013-02-04T09:33:52.750 回答