我有两个我希望连接的数据库。第一个数据库的名称是cenik.dbf,第二个数据库的名称是izdaja.dbf。
cenik.dbf看起来像这样:
itemid | name
1 | some-name
2 | some-other
3 | name xy
...
izdaja.dbf看起来像这样:
invoice | itemid | qty
1 |1 |50
1 |2 |40
2 |1 |50
2 |3 |40
3 |2 |10
3 |3 |40
...
izdaja.dbf是一个包含25k条目的数据库,我希望尽快将特定itemid的所有qty值相加。这是我到目前为止的代码,但它只返回特定itemid的第一个数据。
CLEAR
SELECT 1
USE cenik
SELECT 2
USE izdaja
INDEX ON itemid TO in_izd
SELECT 1
SET RELATION TO itemid INTO izdaja
GO TOP
DO WHILE .NOT. eof()
?itemid
??' '
STORE (izdaja -> qty) TO iz
??' '
??iz
SKIP 1
ENDDO
WAIT
CLOSE ALL
CLEAR
RETURN
有人可以帮助我吗?
答案 0 :(得分:0)
如果其他答案对您不起作用,您可能需要在帖子中详细说明。编辑以显示您对输出的期望。但我也会提供一个选择。您似乎对所呈现的输出样本中将要发生的事情感到困惑。你拥有的将为每个cenik打印一条记录,无论izdaja中的第一个数据记录是什么。 dBASE还支持sql查询,并应自动利用表中可用的任何索引。如果没有,我怀疑它会在运行中创建一个索引来帮助优化查询。
此查询将获取每个“Cenik”ID,总数量和grins,该ID的记录数。然后你可以扫描输出。如果您只想要一个特定的单个ItemID,那么user304067提供的答案就可以了。
if used( "tmpSummary" )
select tmpSummary
use
endif
select;
c.itemid,;
c.name,;
count(*) as TotalRecords,;
sum(i.qty ) as TotalQty;
from ;
cenik c ;
join izdaja i ;
on c.itemid = i.itemid ;
group by ;
c.itemid ;
into ;
table tmpSummary
*/ Now, you have the data, now dump it out however you want.
select tmpSummary
do while not eof()
? itemid
?? name
?? TotalRecords
?? TotalQty
enddo
use
现在,如果你只想要一个SINGLE ItemID,你可以在“INTO”子句之前添加一个SQL-Where子句。
where c.itemid = TheOneIDYouWant ;
into table tmpSummary
现在,我的语法基于多年使用Visual FoxPro(VFP),但希望dBASE在其sql中非常接近。我无法确认的唯一真正的不同是它对“into”条款的支持。在VFP中,您可以执行“into cursor Something”,它将创建一个基于MEMORY-ONLY的dbf结果实例,这样当它关闭时,用于它的临时表也是如此。否则,此示例将进入另一个您必须在之后管理和删除的实际TABLE。
如果您希望以报告格式输出,通过将SQL用于表(或Cursor),您可以创建报表布局,只需将此结果用于报表而不基于行? (打印)命令,如你所知,不提供任何格式或对齐方式。您也可以将此结果复制到输出格式,例如通过CSV格式化excel,并在其他工具中执行其他任何操作。
答案 1 :(得分:-1)
使用此:
USE izdaja
sum qty to aa(just a variable) for itemid = 1
结果将是变量aa
,qty
1总共itemid