1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

011 - Paginação dos dados

Discussão em 'Ambiente Web - Webspeed e/ou StarWeb FrameWork' iniciado por Agnaldo, Janeiro 18, 2014.

  1. Agnaldo

    Agnaldo Membro Ativo

    Tempo estimado de leitura: menos de 20 minutos

    Quando estamos no ambiente host based ou client/server, podemos ler os dados do banco e exibi-los ao usuário com facilidade.
    Independente da quantidade de dados que exista, a sessão do usuário consegue ler os dados à medida que eles são necessários.
    Um exemplo tipico disso é uma query com um browse.
    Basta abrir a query e o browse que a usa pode andar pelos seus registros, mostrando os dados.
    Independente de serem 5 registros ou 5000 registros, eles são trazidos pela rede e mostrados.
    O código abaixo exemplifica isso.
    Código:
    DEFINE QUERY q1 FOR Customer.
    
    DEFINE BROWSE b1 QUERY q1
        DISPLAY Customer.Cust-Num LABEL "Código"
                Customer.Name     LABEL "Nome do cliente"
        WITH 10 DOWN SEPARATORS.
    
    OPEN QUERY q1 FOR EACH Customer NO-LOCK.
    UPDATE b1.
    
    Mas no ambiente web, trazer massas grandes de dados se torna inviável, por causa da velocidade de rede/internet.
    Para a web, nós precisamos trabalhar com um conjunto menor de dados.
    No exemplo equivalente ao citado acima (query/browse) não poderíamos trazer tudo.
    Precisamos quebrar em pedaços, em conjuntos menores.
    Ou seja, precisamos criar conjuntos, páginas, de dados.
    Nós também não temos o browse do Progress para usar. Sendo assim, precisamos nós mesmos mostrar os dados/registros.

    Basicamente aqui é um exercício de uso de query.
    a) Criamos a query
    b) Abrimos a query
    c) Andamos pela query, mostrando os registros

    Teríamos algo assim então...
    PHP:
    DEFINE QUERY q1 FOR Customer SCROLLING.

    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo de paginação</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    OPEN QUERY q1 FOR EACH Customer NO-LOCK INDEXED-REPOSITION.

    GET FIRST q1 NO-LOCK.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'<h1>Tabela esta vazia</h1>' SKIP.
       ELSE
           DO:
              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="1" cellpadding="1">' SKIP
                     
    '      <tr>' SKIP
                     
    '         <td>Código</td>' SKIP
                     
    '         <td>Nome do cliente</td>' SKIP
                     
    '      </tr>' SKIP.
              DO WHILE 
    AVAILABLE Customer:
                 {&
    out'      <tr>' SKIP
                        
    '         <td>' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                        
    '         <td>' Customer.Name '</td>' SKIP
                        
    '      </tr>' SKIP.
                 
    GET NEXT q1 NO-LOCK.
              
    END.
              {&
    out'   </table>' SKIP
                     
    '</div>' SKIP.
           
    END.

    /* Fecha a página html */
    {&out'</body>' SKIP
           
    '</html>' SKIP(1).


    /* Fim do arquivo */
    Que nos daria algo assim como resultado

    [​IMG]

    Podemos notar que estão vindos todos os registros.
    Como estamos usando dados do banco Sports, temos poucos. Mas se fosse uma tabela de produção, poderíamos ter milhares de registros, o que seria inviável.

    Vamos então alterar nosso código para que traga apenas uma "página" de registros.
    Vamos limitar em 10 ...
    PHP:
    DEFINE VARIABLE limiteDaPagina  AS INTEGER INITIAL 10.
    DEFINE VARIABLE contaRegistros  
    AS INTEGER.
    DEFINE QUERY q1 FOR Customer SCROLLING.

    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo de paginação</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    OPEN QUERY q1 FOR EACH Customer NO-LOCK INDEXED-REPOSITION.

    GET FIRST q1 NO-LOCK.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'<h1>Tabela esta vazia</h1>' SKIP.
       ELSE
           DO:
              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="1" cellpadding="1">' SKIP
                     
    '      <tr>' SKIP
                     
    '         <td>Código</td>' SKIP
                     
    '         <td>Nome do cliente</td>' SKIP
                     
    '      </tr>' SKIP.
              DO WHILE 
    AVAILABLE Customer AND contaRegistros limiteDaPagina:
                 {&
    out'      <tr>' SKIP
                        
    '         <td>' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                        
    '         <td>' Customer.Name '</td>' SKIP
                        
    '      </tr>' SKIP.
                 
    GET NEXT q1 NO-LOCK.
                 
    ASSIGN contaRegistros contaRegistros 1.
              END
    .
              {&
    out'   </table>' SKIP
                     
    '</div>' SKIP.
           
    END.


    /* Fecha a página html */
    {&out'</body>' SKIP
           
    '</html>' SKIP(1).


    /* Fim do arquivo */

    Que nos mostraria algo como

    [​IMG]


    Continua...

    Última edição: Janeiro 18, 2014
    brazjuniorgyn curtiu isso.
  2. Agnaldo

    Agnaldo Membro Ativo

    Agora podemos colocar alguma funcionalidade para andar pela query, ou seja, para paginar nossos registros.
    Vamos começar dando a capacidade de ir para os primeiros e para os últimos registros da query, ou seja, para a primeira página e para a última página.

    Vamos colocar dois botões na tela.
    Mas para não precisar usar form e até para dar um visual mais agradável, usaremos imagens para montar a nossa "régua" de navegação. As mesmas estão em anexo.
    Assumindo que esse nosso programa possui o nome de "query.p", podemos montar um pedaço de código que tenha duas imagens, uma que irá navegar para o começo e outra para o final.
    Tais imagens teriam um link nelas, de maneira que quando forem selecionadas, "linkarem", chamarem o próprio programa (query.p) passando para ele "o que" queremos fazer. Ou seja, que "opção" desejamos, se ir para os primeiros ou para os últimos registros.
    Algo assim:
    PHP:
    {&out'      <tr>' SKIP
           
    '         <td colspan="2" align="center">' SKIP
           
    '            <a href="query?opcao=primeiro"><img src="/webforum4each/imagens/btn_primeiro.png" alt="Primeiro" border="0"></a>' SKIP
           
    '            <a href="query?opcao=ultimo"><img src="/webforum4each/imagens/btn_ultimo.png" alt="Ultimo" border="0"></a>' SKIP
           
    '         </td>' SKIP
           
    '      </tr>'.
    Agora, quando clicar numa das imagens, estaremos chamando o nosso programa "query.p" novamente, passando para ele uma opção.
    Basta então que no programa, agora, eu leia, com o GET-VALUE, qual opção foi escolhida e, então, monte a query do Progress baseado nisso.
    Algo sim pode ser usado.
    PHP:
    DEFINE VARIABLE limiteDaPagina  AS INTEGER INITIAL 10.
    DEFINE VARIABLE contaRegistros  
    AS INTEGER.
    DEFINE VARIABLE opcao           AS CHARACTER.
    DEFINE QUERY q1 FOR Customer SCROLLING.

    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo de paginação</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    ASSIGN opcao GET-VALUE("opcao").

    OPEN QUERY q1 FOR EACH Customer NO-LOCK INDEXED-REPOSITION.

    GET FIRST q1 NO-LOCK.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'<h1>Tabela esta vazia</h1>' SKIP.
       ELSE
           DO:
              IF 
    opcao "primeiro"
                 
    THEN
                     GET FIRST q1 NO
    -LOCK.
                 ELSE
                     IF 
    opcao "ultimo" THEN
                        
    DO:
                           
    GET LAST q1 NO-LOCK.
                           
    REPOSITION q1 BACKWARDS limiteDaPagina.
                           
    GET NEXT q1 NO-LOCK.
                        
    END.

              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="1" cellpadding="1">' SKIP
                     
    '      <tr>' SKIP
                     
    '         <td>Código</td>' SKIP
                     
    '         <td>Nome do cliente</td>' SKIP
                     
    '      </tr>' SKIP.
              DO WHILE 
    AVAILABLE Customer AND contaRegistros limiteDaPagina:
                 {&
    out'      <tr>' SKIP
                        
    '         <td>' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                        
    '         <td>' Customer.Name '</td>' SKIP
                        
    '      </tr>' SKIP.
                 
    GET NEXT q1 NO-LOCK.
                 
    ASSIGN contaRegistros contaRegistros 1.
              END
    .
    {&
    out'      <tr>' SKIP
           
    '         <td colspan="2" align="center">' SKIP
           
    '            <a href="query?opcao=primeiro"><img src="/webforum4each/imagens/btn_primeiro.png" alt="Primeiro" border="0"></a>' SKIP
           
    '            <a href="query?opcao=ultimo"><img src="/webforum4each/imagens/btn_ultimo.png" alt="Ultimo" border="0"></a>' SKIP
           
    '         </td>' SKIP
           
    '      </tr>'.

              {&
    out'   </table>' SKIP
                     
    '</div>' SKIP.
           
    END.


    /* Fecha a página html */
    {&out'</body>' SKIP
           
    '</html>' SKIP(1).


    /* Fim do arquivo */
    Um detalhe aqui na parte:
    Código:
    IF opcao = "primeiro"
       THEN
           GET FIRST q1 NO-LOCK.
       ELSE
           IF opcao = "ultimo" THEN
              DO:
                 GET LAST q1 NO-LOCK.
                 REPOSITION q1 BACKWARDS limiteDaPagina.
                 GET NEXT q1 NO-LOCK.
              END.
    
    Na opção "primeiro" apenas damos um GET FIRST na query Progress. Isso fará o ponteiro de registro se posicionar no primeiro registro da query. Mas abaixo o nosso laço de DO WHILE irá ler sequenciamente os registros, mostrando-os.
    Na opção "ultimo" damos um GET LAST, que irá nos posicionar no último registro. Ficaria estranho eu mostrar o último, o penúltimo, o antepenúltimo e assim por diante. Então o que fazemos é reposicionar o ponteiro de registro para "n" registros antes do final, para o que seria o começo de uma "página". Ou seja, já que quantidade de registros por página, indicado pela variável "limiteDaPagina" esta configurado para 10, nós vamos até o último (GET LAST) e voltamos 10 registros, para então o nosso laço de WHILE mais abaixo "andar para frente" e ir mostrando, a partir daí.

    Nossa tela seria algo assim quando nos primeiros.

    [​IMG]

    E assim para a última página.

    [​IMG]



    Continua...

    Arquivos Anexados:

    Última edição: Janeiro 19, 2014
  3. Agnaldo

    Agnaldo Membro Ativo

    Quando navegamos para o inicio ou fim da query não precisamos nos preocupar com "aonde" estávamos.
    Que é diferente quando precisamos fazer a parte de andar pra frente ou para trás nas "páginas".
    Se eu estou na página 1, e meu ultimo registro da página é o 10, significa que se eu andar pra página 2 a mesma deve começar com o registro 11.
    Sendo assim, nós precisamos "guardar" a informação de "quem" é que estava sendo mostrado.
    A exemplo do que vimos no tópico 007, sobre link´s, usar "chaves" de acesso, tal como o código do cliente não é uma boa pratica. Imagine que a chave seja algo como codigo+empresa+filial..., enfim, muita coisa. Vamos usar o ROWID para isso então.
    Usaremos aqui uma estratégia de guardar o ponteiro apenas o último registro que é mostrado. Sabendo qual o último registro da página, poderemos nos achar.
    Obs.: É claro, poderia ser usada a abordagem de ao invés do ultimo guardar o primeiro ou até os dois.

    Então, definimos uma variável "ponteiro" do tipo CHARACTER, e no bloco do WHILE, que é onde lemos e mostramos os registros, setamos ela.
    Código:
    DO WHILE AVAILABLE Customer AND contaRegistros < limiteDaPagina:
       ASSIGN ponteiro = STRING(ROWID(Customer)).
       {&out} '      <tr>' SKIP
              '         <td>' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
              '         <td>' Customer.Name '</td>' SKIP
              '      </tr>' SKIP.
       GET NEXT q1 NO-LOCK.
       ASSIGN contaRegistros = contaRegistros + 1.
    END.
    
    Ao sair do laço WHILE, ponteiro irá conter o ROWID do últmo registro da "página".
    Esse valor é necessário para que "quando" for requisitada a opção "anterior" ou "proximo", possa ser usado.
    A parte dos botões como abaixo, já passando o valor do ponteiro. Ou seja, quando clicar no botão de proximo, passa que a opção é proximo e passa também o ponteiro do ultimo da página, de maneira que, quando o programa roda novamente, damos um GET-VALUE da "opçao" bem como da informação do último listado (ponteiro).

    Bloco do GET-VALUE
    Código:
    ASSIGN opcao    = GET-VALUE("opcao").
           ponteiro = GET-VALUE("ponteiro").
    
    Bloco dos botões/links
    PHP:
    {&out'      <tr>' SKIP
           
    '         <td colspan="2" align="center">' SKIP
           
    '            <a href="query?opcao=primeiro"><img src="/webforum4each/imagens/btn_primeiro.png" alt="Primeiro" border="0"></a>' SKIP
           
    '            <a href="query?opcao=anterior&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_anterior.png" alt="Anterior" border="0"></a>' SKIP
           
    '            <a href="query?opcao=proximo&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_proximo.png" alt="Proximo" border="0"></a>' SKIP
           
    '            <a href="query?opcao=ultimo"><img src="/webforum4each/imagens/btn_ultimo.png" alt="Ultimo" border="0"></a>' SKIP
           
    '         </td>' SKIP
           
    '      </tr>'.
    No código teria algo assim
    PHP:
    DEFINE VARIABLE limiteDaPagina AS INTEGER INITIAL 10.
    DEFINE VARIABLE contaRegistros 
    AS INTEGER.
    DEFINE VARIABLE opcao          AS CHARACTER.
    DEFINE VARIABLE ponteiro       AS CHARACTER.
    DEFINE QUERY q1 FOR Customer SCROLLING.

    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo de paginação</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    ASSIGN opcao    GET-VALUE("opcao").
           
    ponteiro GET-VALUE("ponteiro").


    OPEN QUERY q1 FOR EACH Customer NO-LOCK INDEXED-REPOSITION.

    GET FIRST q1 NO-LOCK.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'<h1>Tabela esta vazia</h1>' SKIP.
       ELSE
           DO:
              IF 
    opcao "primeiro"
                 
    THEN
                     GET FIRST q1 NO
    -LOCK.
                 ELSE
                     IF 
    opcao "ultimo" THEN
                        
    DO:
                           
    GET LAST q1 NO-LOCK.
                           
    REPOSITION q1 BACKWARDS limiteDaPagina.
                           
    GET NEXT q1 NO-LOCK.
                        
    END.

              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="1" cellpadding="1">' SKIP
                     
    '      <tr>' SKIP
                     
    '         <td>Código</td>' SKIP
                     
    '         <td>Nome do cliente</td>' SKIP
                     
    '      </tr>' SKIP.
              DO WHILE 
    AVAILABLE Customer AND contaRegistros limiteDaPagina:
                 
    ASSIGN ponteiro STRING(ROWID(Customer)).
                 {&
    out'      <tr>' SKIP
                        
    '         <td>' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                        
    '         <td>' Customer.Name '</td>' SKIP
                        
    '      </tr>' SKIP.
                 
    GET NEXT q1 NO-LOCK.
                 
    ASSIGN contaRegistros contaRegistros 1.
              END
    .
              {&
    out'      <tr>' SKIP
                     
    '         <td colspan="2" align="center">' SKIP
                     
    '            <a href="query?opcao=primeiro"><img src="/webforum4each/imagens/btn_primeiro.png" alt="Primeiro" border="0"></a>' SKIP
                     
    '            <a href="query?opcao=anterior&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_anterior.png" alt="Anterior" border="0"></a>' SKIP
                     
    '            <a href="query?opcao=proximo&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_proximo.png" alt="Proximo" border="0"></a>' SKIP
                     
    '            <a href="query?opcao=ultimo"><img src="/webforum4each/imagens/btn_ultimo.png" alt="Ultimo" border="0"></a>' SKIP
                     
    '         </td>' SKIP
                     
    '      </tr>'.

              {&
    out'   </table>' SKIP
                     
    '</div>' SKIP.
           
    END.


    /* Fecha a página html */
    {&out'</body>' SKIP
           
    '</html>' SKIP(1).


    /* Fim do arquivo */
    E nossa tela uma aparecia como

    [​IMG]


    Continua...
    Última edição: Janeiro 19, 2014
  4. Agnaldo

    Agnaldo Membro Ativo

    Podemos agora, então, alterar as "opçoes" que nosso programa trata. Alterando o bloco:
    Código:
    IF opcao = "primeiro"
       THEN
           GET FIRST q1 NO-LOCK.
       ELSE
           IF opcao = "ultimo"
              THEN
                  DO:
                     GET LAST q1 NO-LOCK.
                     REPOSITION q1 BACKWARDS limiteDaPagina.
                     GET NEXT q1 NO-LOCK.
                  END.
    
    para tratar também as opções "anterior" e "proximo".
    Para deixar mais limpo, vamos trocar o IF por um CASE.
    No final, teremos um bloco assim:
    Código:
    CASE opcao:
        WHEN "primeiro" THEN
             GET FIRST q1 NO-LOCK.
        WHEN "ultimo" THEN
             DO:
                GET LAST q1 NO-LOCK.
                REPOSITION q1 BACKWARDS limiteDaPagina.
                GET NEXT q1 NO-LOCK.
             END.
        WHEN "proximo" THEN
             DO:
                REPOSITION q1 TO ROWID TO-ROWID(ponteiro) NO-ERROR.
                REPOSITION q1 FORWARD (limiteDaPagina + 1).
                GET NEXT q1 NO-LOCK.
                IF NOT AVAILABLE Customer
                   THEN
                       DO:
                          GET LAST q1 NO-LOCK.
                          REPOSITION q1 BACKWARDS limiteDaPagina.
                          GET NEXT q1 NO-LOCK.
                       END.
                   ELSE
                       DO:
                          REPOSITION q1 TO ROWID TO-ROWID(ponteiro) NO-ERROR.
                          REPOSITION q1 FORWARD 1.
                          GET NEXT q1 NO-LOCK.
                       END.
             END.
        WHEN "anterior" THEN
             DO:
                REPOSITION q1 TO ROWID TO-ROWID(ponteiro) NO-ERROR.
                REPOSITION q1 BACKWARDS ((limiteDaPagina * 2) - 1).
                GET NEXT q1 NO-LOCK.
             END.
        OTHERWISE
            GET FIRST q1 NO-LOCK.
    END CASE.
    
    E nosso código completo será:
    PHP:
    DEFINE VARIABLE limiteDaPagina AS INTEGER INITIAL 10.
    DEFINE VARIABLE contaRegistros 
    AS INTEGER.
    DEFINE VARIABLE opcao          AS CHARACTER.
    DEFINE VARIABLE ponteiro       AS CHARACTER.
    DEFINE QUERY q1 FOR Customer SCROLLING.

    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo de paginação</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    ASSIGN opcao    GET-VALUE("opcao").
           
    ponteiro GET-VALUE("ponteiro").


    OPEN QUERY q1 FOR EACH Customer NO-LOCK INDEXED-REPOSITION.

    GET FIRST q1 NO-LOCK.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'<h1>Tabela esta vazia</h1>' SKIP.
       ELSE
           DO:
              CASE 
    opcao:
                  
    WHEN "primeiro" THEN
                       GET FIRST q1 NO
    -LOCK.
                  
    WHEN "ultimo" THEN
                       
    DO:
                          
    GET LAST q1 NO-LOCK.
                          
    REPOSITION q1 BACKWARDS limiteDaPagina.
                          
    GET NEXT q1 NO-LOCK.
                       
    END.
                  
    WHEN "proximo" THEN
                       
    DO:
                          
    REPOSITION q1 TO ROWID TO-ROWID(ponteiroNO-ERROR.
                          
    REPOSITION q1 FORWARD (limiteDaPagina 1).
                          
    GET NEXT q1 NO-LOCK.
                          IF 
    NOT AVAILABLE Customer
                             THEN
                                 
    DO:
                                    
    GET LAST q1 NO-LOCK.
                                    
    REPOSITION q1 BACKWARDS limiteDaPagina.
                                    
    GET NEXT q1 NO-LOCK.
                                 
    END.
                             ELSE
                                 DO:
                                    
    REPOSITION q1 TO ROWID TO-ROWID(ponteiroNO-ERROR.
                                    
    REPOSITION q1 FORWARD 1.
                                    GET NEXT q1 NO
    -LOCK.
                                 
    END.
                       
    END.
                  
    WHEN "anterior" THEN
                       
    DO:
                          
    REPOSITION q1 TO ROWID TO-ROWID(ponteiroNO-ERROR.
                          
    REPOSITION q1 BACKWARDS ((limiteDaPagina 2) - 1).
                          
    GET NEXT q1 NO-LOCK.
                       
    END.
                  
    OTHERWISE
                      GET FIRST q1 NO
    -LOCK.
              
    END CASE.
      
              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="1" cellpadding="1">' SKIP
                     
    '      <tr>' SKIP
                     
    '         <td>Código</td>' SKIP
                     
    '         <td>Nome do cliente</td>' SKIP
                     
    '      </tr>' SKIP.
              DO WHILE 
    AVAILABLE Customer AND contaRegistros limiteDaPagina:
                 
    ASSIGN ponteiro STRING(ROWID(Customer)).
                 {&
    out'      <tr>' SKIP
                        
    '         <td>' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                        
    '         <td>' Customer.Name '</td>' SKIP
                        
    '      </tr>' SKIP.
                 
    GET NEXT q1 NO-LOCK.
                 
    ASSIGN contaRegistros contaRegistros 1.
              END
    .
              {&
    out'      <tr>' SKIP
                     
    '         <td colspan="2" align="center">' SKIP
                     
    '            <a href="query?opcao=primeiro"><img src="/webforum4each/imagens/btn_primeiro.png" alt="Primeiro" border="0"></a>' SKIP
                     
    '            <a href="query?opcao=anterior&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_anterior.png" alt="Anterior" border="0"></a>' SKIP
                     
    '            <a href="query?opcao=proximo&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_proximo.png" alt="Proximo" border="0"></a>' SKIP
                     
    '            <a href="query?opcao=ultimo"><img src="/webforum4each/imagens/btn_ultimo.png" alt="Ultimo" border="0"></a>' SKIP
                     
    '         </td>' SKIP
                     
    '      </tr>'.

              {&
    out'   </table>' SKIP
                     
    '</div>' SKIP.
           
    END.


    /* Fecha a página html */
    {&out'</body>' SKIP
           
    '</html>' SKIP(1).


    /* Fim do arquivo */


    Continua...
    Última edição: Janeiro 19, 2014
  5. Agnaldo

    Agnaldo Membro Ativo

    E gastando alguns minutos a mais, podemos deixar mais agradável e funcional a nossa tela, usando cores para realçar o grid e tratando os botões para só aparecerem quando forem úteis.
    Por exemplo, se você já esta na primeira página, não tem porque aparecer os botões de primeiro e anterior. Idem se você estiver na última página. Não tem porque aparecer os botões de próximo e último.

    PHP:
    DEFINE VARIABLE limiteDaPagina AS INTEGER INITIAL 10.
    DEFINE VARIABLE contaRegistros 
    AS INTEGER.
    DEFINE VARIABLE opcao          AS CHARACTER.
    DEFINE VARIABLE ponteiro       AS CHARACTER.
    DEFINE VARIABLE posicao        AS CHARACTER.
    DEFINE VARIABLE corDeFundo     AS CHARACTER.
    DEFINE QUERY q1 FOR Customer SCROLLING.

    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo de paginação</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    ASSIGN opcao    GET-VALUE("opcao").
           
    ponteiro GET-VALUE("ponteiro").


    OPEN QUERY q1 FOR EACH Customer NO-LOCK INDEXED-REPOSITION.

    GET FIRST q1 NO-LOCK.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'<h1>Tabela esta vazia</h1>' SKIP.
       ELSE
           DO:
              CASE 
    opcao:
                  
    WHEN "primeiro" THEN
                       
    DO:
                          
    GET FIRST q1 NO-LOCK.
                          
    ASSIGN posicao "inicio".
                       
    END.
                  
    WHEN "ultimo" THEN
                       
    DO:
                          
    GET LAST q1 NO-LOCK.
                          
    REPOSITION q1 BACKWARDS limiteDaPagina.
                          
    GET NEXT q1 NO-LOCK.
                          
    ASSIGN posicao "final".
                       
    END.
                  
    WHEN "proximo" THEN
                       
    DO:
                          
    REPOSITION q1 TO ROWID TO-ROWID(ponteiroNO-ERROR.
                          
    REPOSITION q1 FORWARD (limiteDaPagina 1).
                          
    GET NEXT q1 NO-LOCK.
                          IF 
    NOT AVAILABLE Customer
                             THEN
                                 
    DO:
                                    
    GET LAST q1 NO-LOCK.
                                    
    REPOSITION q1 BACKWARDS limiteDaPagina.
                                    
    GET NEXT q1 NO-LOCK.
                                    
    ASSIGN posicao "final".
                                 
    END.
                             ELSE
                                 DO:
                                    
    REPOSITION q1 TO ROWID TO-ROWID(ponteiroNO-ERROR.
                                    
    REPOSITION q1 FORWARD 1.
                                    GET NEXT q1 NO
    -LOCK.
                                 
    END.
                       
    END.
                  
    WHEN "anterior" THEN
                       
    DO:
                          
    REPOSITION q1 TO ROWID TO-ROWID(ponteiroNO-ERROR.
                          
    REPOSITION q1 BACKWARDS ((limiteDaPagina 2) - 1).
                          
    GET PREV q1 NO-LOCK.
                          IF 
    NOT AVAILABLE Customer
                             THEN
                                 ASSIGN posicao 
    "inicio".
                          
    GET NEXT q1 NO-LOCK.
                       
    END.
                  
    OTHERWISE
                       
    DO:
                          
    GET FIRST q1 NO-LOCK.
                          
    ASSIGN posicao "inicio".
                       
    END.
              
    END CASE.

              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="2" cellpadding="1" style="border-collapse:collapse">' SKIP
                     
    '      <tr bgcolor="#FFFFCC">' SKIP
                     
    '         <td><b>Código</b></td>' SKIP
                     
    '         <td><b>Nome do cliente</b></td>' SKIP
                     
    '      </tr>' SKIP.
              DO WHILE 
    AVAILABLE Customer AND contaRegistros limiteDaPagina:
                 
    ASSIGN ponteiro STRING(ROWID(Customer)).
                 IF 
    corDeFundo "#FFFFF0"
                    
    THEN
                        ASSIGN corDeFundo 
    "#EEEEE0".        
                    ELSE
                        
    ASSIGN corDeFundo "#FFFFF0".        
                 {&
    out'      <tr bgcolor="' corDeFundo '">' SKIP
                        
    '         <td align="center">' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                        
    '         <td>' Customer.Name '</td>' SKIP
                        
    '      </tr>' SKIP.
                 
    GET NEXT q1 NO-LOCK.
                 
    ASSIGN contaRegistros contaRegistros 1.
              END
    .

              {&
    out'      <tr>' SKIP
                     
    '         <td colspan="2" align="center">' SKIP.

              IF 
    NOT posicao "inicio"
                 
    THEN
                     
    {&out'            <a href="query?opcao=primeiro"><img src="/webforum4each/imagens/btn_primeiro.png" alt="Primeiro" border="0"></a>' SKIP
                            
    '            <a href="query?opcao=anterior&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_anterior.png" alt="Anterior" border="0"></a>' SKIP.

              IF 
    NOT posicao "final"
                 
    THEN
                     
    {&out'            <a href="query?opcao=proximo&ponteiro=' ponteiro '"><img src="/webforum4each/imagens/btn_proximo.png" alt="Proximo" border="0"></a>' SKIP
                            
    '            <a href="query?opcao=ultimo"><img src="/webforum4each/imagens/btn_ultimo.png" alt="Ultimo" border="0"></a>' SKIP.

              {&
    out'         </td>' SKIP
                     
    '      </tr>'.

              {&
    out'   </table>' SKIP
                     
    '</div>' SKIP.
           
    END.


    /* Fecha a página html */
    {&out'</body>' SKIP
           
    '</html>' SKIP(1).


    /* Fim do arquivo */

    [​IMG]


    Curtiu?
    Até o próximo post
    Última edição: Janeiro 21, 2014
    leal e liliane curtiram isso.
  6. Agnaldo

    Agnaldo Membro Ativo

    .

Compartilhe esta Página