2012-12-14 2 views
1

최종 테이블을 집계하고 조인 파트를 해결하는 방법을 알고 싶습니다. 프로 시저에 각 행을 전달하는 내 테이블 contracts.dbf를 통과하는 Do While 루프가 있습니다. 이 프로시 저는이 정보를 사용하고 다른 테이블에서 원하는 데이터를 선택합니다. 원하는 모든 집계는 각 루프의 모든 결과입니다. 따라서 contracts.dbf에 101 개의 행이있는 경우 joining.dbf는 101 열입니다. 내 절차는 파라미터로서 contracts.dbf 각 값을 얻어 FoxPro 9.0 집계가있는 테이블 조인

bs_case 
=================================== 
depot_nr  Psres3pcgb 
22    123 
31    222 
22    345 
32    444 
23    222 
22    222 

contracts.dbf 
=================================== 
22 
31 
32 
23 

같이

DELETE FILES *.tmp RECYCLE 
SELECT distinct depot_nr FROM bs_case; 
INTO table contracts.tmp 

SELECT RECNO() as rownum,; 
    depot_nr as depot_nr; 
FROM contracts.tmp 
NbContracts =RECCOUNT() 
COPY TO test3.dbf 
CLOSE TABLES 

counter = 1 

DO WHILE counter < NbContracts 
    SELECT depot_nr as depot_nr; 
    WHERE rownum = counter FROM test3 
    test33(depot_nr, counter) 
    counter = counter + 1 
ENDDO 
CLOSE TABLES 

PROCEDURE test33(depot_nr_in, NbofTimes) 
use bs_case alias bs 
SELECT Depot_nr    as depot_nr,; 
     Psres3pcgb    as psres3pcgb; 
    WHERE Depot_nr = depot_nr_in FROM bs INTO TABLE toJoin.tmp 

DO CASE 
    CASE NbofTimes = 1 
     SELECT * FROM toJoin.tmp 
     COPY TO joining.dbf 
    CASE NbofTimes = NbContracts 
     ?counter 
     SELECT * FROM bsP.tmp as one LEFT JOIN joining.dbf as aggregated; && ERROR HERE 
     ON (one.depot_nr = aggregated.depot_nr) into table joining.dbf 
     CLOSE TABLES 
     ENDPROC 
    Otherwise 
     SELECT * FROM toJoin.tmp as one LEFT JOIN joining.dbf as aggregated; && ERROR HERE 
     ON (one.depot_nr = aggregated.depot_nr) into table joining.dbf 
     CLOSE TABLES 
ENDCASE 
CLOSE TABLES 
CLOSE DATABASES 
ENDPROC 

데이터 보인다. 이것은 do while 루프로 수행됩니다.

최종 결과를 test33 절차를 실행할 때마다 테이블로 만들고 싶습니다. 예.

Loop 1 
=============== 
    22 
the result 

Loop2 
============== 
    22   31 
test33(22) test33(31) 

Loop3 
============== 
    22   31    32 
test33(22) test33(31)  test33(32) 

Loop4 
============== 
    22   31    32    23 
test33(22) test33(31)  test33(32)  test33(23) 

각 테스트 결과 (##)는 값의 열입니다. 이게 내가하고 싶은 일에 대한 더 나은 그림을 보여주기를 바랍니다.

+0

프로 시저에서 수행하려는 작업은 매우 비생산적입니다. 어떤 종류의 교차 표를 원하지만 매우 비효율적 인 것처럼 보입니다. 데이터의 일부 샘플을 제공해 주시겠습니까? 원본 데이터의 3 또는 4 "Depot_NR"항목을 말하십시오. 그런 다음 제시 할 결과가 무엇인지 보여주십시오. 그것은 당신을 도와 줄 훨씬 더 좋은 기회를 줄 것입니다. – DRapp

답변

1

향후 실행을 위해 결과를 저장할 필요가없는 한 SELECT INTO TABLE 또는 COPY TO를 할 필요가 없습니다.

서브 루틴이나 루프가 전혀 필요 없다고 생각됩니다. 샘플 데이터와 원하는 결과를 보여 주시겠습니까? 샘플 데이터를 표시하려면 CREATE CURSOR 및 INSERT INTO를 사용하십시오. 따라서 도움을 원하는 사람은 누구나 해당 행을 복사하고 테스트 데이터를 만들 수 있습니다.

+0

안녕하세요, 미안하지만 분명하지 않은 경우 – Orongo