Todos os Registros na query

Discussão em 'Progress 4GL' iniciado por lwazevedo, Fevereiro 22, 2013.

  1. lwazevedo

    lwazevedo Membro Ativo

    Caros Amigos, Fiz a seguinte query, conforme a baixo.

    DEFINE VARIABLE i AS INTEGER.
    DEFINE VARIABLE qh AS WIDGET-HANDLE.
    DEFINE VARIABLE bh AS WIDGET-HANDLE.
    DEFINE VARIABLE fh AS WIDGET-HANDLE.

    def temp-table tt
    field campo as char
    field valor as char.

    def var c-tab as char.
    c-tab = "b-carro".

    CREATE BUFFER bh FOR TABLE c-tab.
    CREATE QUERY qh.

    qh:SET-BUFFERS(bh).
    qh:QUERY-PREPARE("for each " + c-tab).
    qh:QUERY-OPEN.
    qh:GET-FIRST.


    REPEAT i = 1 TO bh:num-fields.

    fh = bh:BUFFER-FIELD(i).

    create tt.
    assign tt.campo = fh:name
    tt.valor = STRING(fh:BUFFER-VALUE).

    END.

    DELETE WIDGET bh.

    ela faz exatamente o que eu preciso, porém o repeat começa em 1 e termina quando chega no ultimo campo existente da tabela, e por causa disto, o conteúdo é impresso uma unica vez.... Exemplo :

    digamos que a table tem 3 campos: nome, sobrenome e idade e que tenha 300 registros.
    quando ele cria a temp ele simplesmente coloca os três campos nome, sobrenome e idade com a penas um único registro como se fosse uma amostra dos campos ta tabela com seus valores.

    E eu precisava que ele trouce-se os três campos nome, sobrenome e idade mas com todos os registros existentes na tabela.

    Estou fazendo desta forma por que preciso que ele gere a temp-table conforme a tabela do banco que for passada por parâmetro.



    valeu.
  2. lwazevedo

    lwazevedo Membro Ativo

    Olá amigos,

    Alguém poderia me ajudar na situação que coloquei acima.



    Valeu.
  3. joelscampos

    joelscampos Membro Participativo

    E se você colocar o Repeat dentro de um FOR EACH assim?

    Código:
    /**/
    FOR  EACH b-carro NO-LOCK:
    
        REPEAT i = 1 TO bh:num-fields.
    
            fh = bh:BUFFER-FIELD(i).
            
            create tt.
            assign tt.campo = fh:name
            tt.valor = STRING(fh:BUFFER-VALUE).
        
        END.
    END. /*FOR EACH b-carro*/
    
    A sua tabela b-carro tem uma chave primária, certo? Se sim, então acho que vc teria que guardá-la na "tt" para indicar a qual registro pertencem os valores. Algo assim:
    Código:
    def temp-table tt
        FIELD idCarro AS INT 
        field campo as char
        field valor as char.
        
    /**/
    FOR  EACH b-carro NO-LOCK:
    
        REPEAT i = 1 TO bh:num-fields.
    
            fh = bh:BUFFER-FIELD(i).
            
            create tt.
            assign 
                tt.campo   = fh:name
                tt.valor   = STRING(fh:BUFFER-VALUE).
    
            /*em cada registro criado, guarda a referencia do registro b-carro*/
            IF fh:NAME = "campo_chave_da_tabela_b-carro" THEN
                ASSIGN tt.idCarro = fh:BUFFER-VALUE.
        END.
    END. /*FOR EACH */
    
    A sua idéia é fazer um for each totalmente reutilizável? Se sim, tentei isso várias vezes e o problema é que o único jeito que conheço para percorrer os registros é usando o FOR EACH, e daí não tem jeito, o for each requer o nome da tabela.
  4. lwazevedo

    lwazevedo Membro Ativo

    Ola joels campos,

    realmente minha intenção era fazer o for each reutilizável onde só passaria o nome da tabela e ele iria fazer o resto, colocando os campos e seus registro, mas realmente estou vendo que é impossível. não consigo acreditar que não tenha como fazer isso no progress, mas obrigado pela ajuda, realmente desta forma ele trás todos os registros, mas tem que colocar o nome da tabela.

    Mais uma vez obrigado. bom já que nós não sabemos como fazer isso, vou esperar para ver se alguém sabe. mas valeu a força.
  5. ChacMaster

    ChacMaster Membro Participativo

    Eu não sei se eu entendi direito, mas.....

    Eu acho que é isso que você quer fazer:

    a variável que esta com "extent", será a quantidade de campos de tabela que suporta......

    Código:
    Define Temp-table tt-dados No-undo
        Field campo As Character Format "X(50)"
        Field valor As Character Format "X(50)".
    
    Define Variable ix As Integer   No-undo.
    Define Variable qh As Handle    No-undo.
    Define Variable bh As Handle    No-undo.
    Define Variable fh As Handle    No-undo Extent 50. 
    Define Variable tb As Character No-undo.
    
    Assign tb = "Customer".
    
    Create Buffer bh For Table tb.
    Create Query qh. 
    qh:Set-buffers(bh).
    qh:Query-prepare("For Each " + tb).
    qh:Query-open().
    qh:Get-first(). 
    
    Repeat:
        IF qh:Query-off-end Then Leave.
        Assign ix = 0.
        Repeat ix = 1 TO bh:Num-fields:  
           fh[ix] = bh:Buffer-field(ix).  
           Create tt-dados.
           Assign tt-dados.campo = fh[ix]:Name
                  tt-dados.valor = String(fh[ix]:Buffer-value).
        End.
        qh:Get-next.
    End.
    
    qh:Query-close().
    bh:Buffer-release().
    
    Delete Object bh.
    Delete Object qh.
    
    For Each tt-dados:
        Disp tt-dados With Frame X Width 138 2 Col Down.
    End.
    
  6. lwazevedo

    lwazevedo Membro Ativo

    ChacMaster,

    Perfeito o exemplo, até o momento me pergunto por não pensei em usar o extent , esta funcionando perfeitamente mesmo. bom
    obrigado por esta ajuda, estou criando isso para um outro proposito e assim que estiver pronto vou postar aqui.

    obrigado.

Compartilhe esta Página