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

007 - Links - Dando RUN em outras páginas/programas

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

  1. Agnaldo

    Agnaldo Membro Ativo

    Tempo estimado de leitura: menos de 15 minutos

    Através da 4GL podemos facilmente, a partir de um programa, rodar outro.
    É o comando RUN que nos permite isso.

    Por exemplo:
    Código:
    UPDATE cliente.
    RUN calculaSaldo.p (INPUT cliente, OUTPUT valorSaldo)
    DISPLAY valorSaldo.
    
    Nesse caso, recebemos o código de um cliente e passamos o mesmo para outro programa (calculaSaldo.p). Esse outro programa faz algo e nos devolve um valor.
    Ou seja, de um programa chamamos, damos RUN, em outro.

    RUN é um comando da 4GL, e, qualquer que seja o ambiente, caracter, gráfico, appserver, web, ele pode ser usado.

    Mas ele é um comando que, no nosso caso, para web, é executado pelo programa quando o mesmo esta sendo executado pelo servidor. Ou seja, quando ele é executado e, então, ele gera uma saída HTML que volta para o browser.

    O que é completamente diferente de termos uma tela no browser e “dela”, da tela, rodarmos outro programa.

    Estando no browser, quando clicamos em algo e o mesmo “roda” outra página, temos o chamado “link”.

    Um “link” numa página é, a grosso modo dizendo, uma maneira de invocarmos outra URL, de chamarmos outro programa, ou seja, de darmos um RUN em outra página/programa nosso.

    Digamos que temos dois programas (p1.p e p2.p).
    O programa p1 é executado e nos mostra uma tela.
    Nessa tela desejamos poder clicar em algo e a partir disso "rodar" o programa p2.

    Nosso programa p1 poderia ser algo assim:
    PHP:
    src/web/method/wrap-cgi.}
    output-content-type("text/html").

    {&
    out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>P1</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    {&
    out'Clique aqui para chamar a outra página' SKIP(1).

    {&
    out'</body>' SKIP
           
    '</html>' SKIP(1).
    Mas queremos que a frase "Clique aqui para chamar a outra página" a palavra "aqui" seja um link, de forma que quando clicarmos nela, sejamos redirecionados (demos um RUN) no programa p2, que é nosso outra página.
    Podemos então alterar nosso código para incluir esse link:
    PHP:
    src/web/method/wrap-cgi.}
    output-content-type("text/html").

    {&
    out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>P1</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    {&
    out'Clique <a href="p2.p">aqui</a> para chamar a outra página' SKIP(1).

    {&
    out'</body>' SKIP
           
    '</html>' SKIP(1).
    E terenos algo parecido com isso:

    [​IMG]

    Quando clicamos sobre o link, seremos redirecionados para o programa/página p2.p.


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

    Agnaldo Membro Ativo

    Podemos pegar o exemplos mostrado no tópico Mostrando vários registros e trabalhar com ele.
    PHP:
    DEFINE VARIABLE corDeFundo AS CHARACTER.

    /* 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</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    /* Conteúdo da página html */
    FIND FIRST Customer NO-LOCK NO-ERROR.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'Tabela esta vázia' SKIP.
       ELSE
           DO:
              {&
    out'<div align="center">' SKIP
                     
    '   <table border="1" cellspacing="1" cellpadding="1">' SKIP
                     
    '      <tr align="center">' SKIP
                     
    '         <td colspan="5"><b>Relação de Clientes</b></td>' SKIP
                     
    '      </tr>' SKIP
                     
    '      <tr bgcolor="#FFFFCC" align="center">' SKIP
                     
    '         <td><b>Código</b></td>' SKIP
                     
    '         <td><b>Nome do cliente</b></td>' SKIP
                     
    '         <td><b>Pais</b></td>' SKIP
                     
    '         <td><b>Estado</b></td>' SKIP
                     
    '         <td><b>Cidade</b></td>' SKIP
                     
    '      </tr>' SKIP.
              FOR 
    EACH Customer NO-LOCK:
                  IF 
    corDeFundo "#EAEAEA"
                     
    THEN
                         ASSIGN corDeFundo 
    "#DCDCDC".
                     ELSE
                         
    ASSIGN corDeFundo "#EAEAEA".
                  {&
    out'      <tr bgcolor="' corDeFundo '">' SKIP
                         
    '         <td align="center">' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
                         
    '         <td>' Customer.Name '</td>' SKIP
                         
    '         <td>' Customer.Country '</td>' SKIP
                         
    '         <td>' Customer.State '</td>' SKIP
                         
    '         <td>' Customer.City '</td>' SKIP
                         
    '      </tr>' SKIP.
              
    END.
             {&
    out'   </table>' SKIP
                    
    '</div>' SKIP.
           
    END.

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

    /* Fim do arquivo */
    No código acima listamos os clientes da tabela Customer.
    Ficaria interessante, ao selecionarmos um cliente, "linkarmos" com uma pagina que mostre o "detalhe" do cliente.
    Usaremos para tanto o código do cliente que é mostrado, transfrmando-o em área clicável, ou seja, em um link.
    No local onde temos:
    PHP:
    '         <td align="center">' Customer.Cust-Num FORMAT "9999" '</td>' SKIP
    Iremos alterar para chamar, via link, o programa detalhe-cliente.p
    PHP:
    '         <td align="center"><a href="detalhe-cliente.p">' Customer.Cust-Num FORMAT "9999" '</a></td>' SKIP
    O que nos dará uma saída semelhante a essa, onde podemos notar que o código se tornou um link.

    [​IMG]

    Se passarmos o mouse pelo código (link) veremos que todos estão apontando para o programa detalhe-cliente.p.
    Ou seja, se clicarmos ali, seremos redirecionados (daremos run) para o detalhe-cliente.p.

    Mas não basta apenas chamar (linkar) para o outro programa.
    O programa detalhe-cliente irá nos mostrar uma tela com os dados de detalhe de "um cliente", no caso, aquele será clicado.
    Precisamos então passar para o programa de detalhe, via link, "qual" cliente esta sendo selecionado.
    Chamamos a isso de passagem de parâmetros pela URL ou por "query string".

    O nosso link terá a seguint forma:
    detalhe-cliente?cliente=10&programa=exemplo.p&ordens=sim
    onde:
    • detalhe-cliente é o nome do programa para o qual estamos linkando.
    • cliente é o parâmetro que identifica "qual" cliente estamos passando
    • programa é o nome do programa que "esta" chamando o link, de forma que o programa detalhe saberá para quem voltar
    • ordens indica que, se além do dados de detalhe do cliente, queremos também mostras as ordens de compra dele.
    Pelo nosso exemplo, cliente será o cliente selecionado, já programa e ordens terão valores fixos.

    Nossa pedaço de programa para montar o link seria algo como:
    PHP:
    '         <td align="center"><a href="detalhe-cliente.p?cliente=' Customer.Cust-Num '&programa=exemplo&ordens=sim">' Customer.Cust-Num FORMAT "9999" '</a></td>' SKIP
    Podemos notar que esse campo cliente é a chave de acesso ao registro da tabela Customer, que é o conteúdo do campo cust-num.
    Aqui fica simples, pois passamos o código e depois apenas damos um FIND por ele.
    Algo como:
    FIND Customer WHERE Customer.Cust-Num = cliente...
    Mas imaginemos que o código não fosse a única chave.
    E se a chave para o registro fosse empresa+filial+setor+codigo.
    Teríamos que passar um monte de campos pela URL.
    Uma macete aqui é que, quando precisamos passar dados para localização de um registro, não passemos, se possível, a chave (campos chaves) mas sim o ROWID do registro, que é um campo apenas.

    Então, podemos alterar a parte do link para:
    PHP:
    '         <td align="center"><a href="detalhe-cliente.p?cliente=' STRING(ROWID(Customer)) '&programa=exemplo&ordens=sim">' Customer.Cust-Num FORMAT "9999" '</a></td>' SKIP
    Agora nosso link esta correto.
    Nosso programa "exemplo" esta fazendo link para o programa detalhe-cliente.
    Basta agora que montemos o programa de detalhe.


    Continua...
    Última edição: Janeiro 4, 2014
    brazjuniorgyn curtiu isso.
  3. Agnaldo

    Agnaldo Membro Ativo

    Para o nosso programa de detalhe usaremos como base o código do tópico Mostrando um registro.
    PHP:
    /* 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>Detalhe do cliente</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    /* Conteúdo da página html */
    FIND FIRST Customer NO-LOCK NO-ERROR.
    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'Tabela esta vázia' SKIP.
       ELSE
           DO:
              {&
    out'<table border="0" cellspacing="1" cellpadding="1" width="100%">' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td colspan="4" align="center" bgcolor="#FFFFCC"><strong>Registro do cliente ' Customer.Cust-Num '</strong></td>' SKIP
                     
    '   <tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Nome:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Name '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Endereço:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Address (IF Customer.Address2 <> '' THEN (', ' Customer.Address2) ELSE '''</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Cidade:</strong></td>' SKIP
                     
    '      <td>' Customer.City '</td>' SKIP
                     
    '      <td align="right"><strong>Estado:</strong></td>' SKIP
                     
    '      <td>' Customer.State '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Código postal:</strong></td>' SKIP
                     
    '      <td>' Customer.Postal-Code '</td>' SKIP
                     
    '      <td align="right"><strong>Telefone:</strong></td>' SKIP
                     
    '      <td>' Customer.Phone '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Contato:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Contact '</td>' SKIP
                     
    '   </tr>' SKIP.

              
    FIND FIRST SalesRep OF Customer NO-LOCK NO-ERROR.
              IF 
    AVAILABLE SalesRep
                 THEN
                     
    {&out'   <tr>' SKIP
                            
    '      <td align="right"><strong>Representante:</strong></td>' SKIP
                            
    '      <td colspan="3">' Customer.Sales-Rep ' - ' SalesRep.Rep-Name '</td>' SKIP
                            
    '   </tr>' SKIP.
                 ELSE
                     {&
    out'   <tr>' SKIP
                            
    '      <td align="right"><strong>Representante:</strong></td>' SKIP
                            
    '      <td colspan="3">' Customer.Sales-Rep '</td>' SKIP
                            
    '   </tr>' SKIP.

              {&
    out'   <tr>' SKIP
                     
    '      <td align="right"><strong>Crédito:</strong></td>' SKIP
                     
    '      <td>' Customer.Credit-Limit FORMAT "->>>,>>>,>>9.99" '</td>' SKIP
                     
    '      <td align="right"><strong>Balanço:</strong></td>' SKIP
                     
    '      <td>' Customer.Balance FORMAT "->>>,>>>,>>9.99" '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Termos:</strong></td>' SKIP
                     
    '      <td>' Customer.terms '</td>' SKIP
                     
    '      <td align="right"><strong>Disconto:</strong></td>' SKIP
                     
    '      <td>' Customer.Discount FORMAT "->>9.99" '%</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Observações:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Comments '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '</table>' SKIP.

           
    END.

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

    /* Fim do arquivo */
    Porém, enquanto esse exemplo faz apenas um FIND FIRST, precisamos que agora ele busque um cliente especifico.

    A primeira coisa que faremos a "ler" os 3 parâmetros passados, que são o código do cliente, o nome do programa chamador e o flag que indica se mostra as ordens ou não.

    Iremos então definir 3 variáveis, que irão guardar tais itens.
    Código:
    DEFINE VARIABLE ponteiro     AS CHARACTER.
    DEFINE VARIABLE programa     AS CHARACTER.
    DEFINE VARIABLE mostraOrdens AS CHARACTER.
    
    As três variáveis foram criadas como character, isso porque serão uadas para ler os dados vindos do browser.
    O browser não manda dados tipados, ou seja, tudo vem como caracter.

    Precisamos agora de algum "comando" que permite ler dados vindos do browser.
    Dentro da include wrap-cgi.i existe uma função (entre outras) que pode ser usada para isso. GET-VALUE.
    A função GET-VALUE seria mais ou menos assim:
    ASSIGN ponteiro = GET-VALUE("cliente").
    Onde ponteiro é a nossa variável que irá guardar o retorno da função.
    Para a função, nós passamos o "nome" do parâmetro que desejamos ler.
    Notem que esta entre aspas, ou seja, pode ser qualquer "nome".
    Nós definimos que o programa origem passaria um parâmetro e o nome dele seria "cliente".

    Então, nosso código poderia ser algo como:
    Código:
    ASSIGN ponteiro     = GET-VALUE("cliente")
           programa     = GET-VALUE("programa")
           mostraOrdens = GET-VALUE("ordens").
    
    Um detalhe muito importante.
    O parâmetro passado para o GET-VALUE é case-sensitive, ou seja:
    Código:
    ASSIGN p1 = GET-VALUE("cliente")
           p2 = GET-VALUE("CLiente")
           p3 = GET-VALUE("CLIENTE").
    
    Esta lendo 3 (três) parâmetros diferentes..

    Continua ...
    brazjuniorgyn curtiu isso.
  4. Agnaldo

    Agnaldo Membro Ativo

    Agora que temos os parâmetros passados já armazenados nas nossas variáveis, basta alteramos nosso código, deixando algo assim:
    PHP:
    DEFINE VARIABLE ponteiro     AS CHARACTER.
    DEFINE VARIABLE programa     AS CHARACTER.
    DEFINE VARIABLE mostraOrdens AS CHARACTER.

    DEFINE VARIABLE corDeFundo   AS CHARACTER.


    /* 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>Detalhe do cliente</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    /* Conteúdo da página html */

    ASSIGN ponteiro     GET-VALUE("cliente")
           
    programa     GET-VALUE("programa")
           
    mostraOrdens GET-VALUE("ordens").

    IF 
    ponteiro BEGINS "0x"
       
    THEN
           FIND Customer WHERE ROWID
    (Customer) = TO-ROWID(ponteiroNO-LOCK NO-ERROR.
       ELSE
           
    FIND Customer WHERE Customer.Cust-Num INTEGER(ponteiroNO-LOCK NO-ERROR.

    IF 
    NOT AVAILABLE Customer
       THEN
           
    {&out'Cliente não localizado' SKIP.
       ELSE
           DO:
              {&
    out'<table border="0" cellspacing="1" cellpadding="1" width="100%">' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td colspan="4" align="center" bgcolor="#FFFFCC"><strong>Registro do cliente ' Customer.Cust-Num '</strong></td>' SKIP
                     
    '   <tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Nome:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Name '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Endereço:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Address (IF Customer.Address2 <> '' THEN (', ' Customer.Address2) ELSE '''</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Cidade:</strong></td>' SKIP
                     
    '      <td>' Customer.City '</td>' SKIP
                     
    '      <td align="right"><strong>Estado:</strong></td>' SKIP
                     
    '      <td>' Customer.State '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Código postal:</strong></td>' SKIP
                     
    '      <td>' Customer.Postal-Code '</td>' SKIP
                     
    '      <td align="right"><strong>Telefone:</strong></td>' SKIP
                     
    '      <td>' Customer.Phone '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Contato:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Contact '</td>' SKIP
                     
    '   </tr>' SKIP.

              
    FIND FIRST SalesRep OF Customer NO-LOCK NO-ERROR.
              IF 
    AVAILABLE SalesRep
                 THEN
                     
    {&out'   <tr>' SKIP
                            
    '      <td align="right"><strong>Representante:</strong></td>' SKIP
                            
    '      <td colspan="3">' Customer.Sales-Rep ' - ' SalesRep.Rep-Name '</td>' SKIP
                            
    '   </tr>' SKIP.
                 ELSE
                     {&
    out'   <tr>' SKIP
                            
    '      <td align="right"><strong>Representante:</strong></td>' SKIP
                            
    '      <td colspan="3">' Customer.Sales-Rep '</td>' SKIP
                            
    '   </tr>' SKIP.

              {&
    out'   <tr>' SKIP
                     
    '      <td align="right"><strong>Crédito:</strong></td>' SKIP
                     
    '      <td>' Customer.Credit-Limit FORMAT "->>>,>>>,>>9.99" '</td>' SKIP
                     
    '      <td align="right"><strong>Balanço:</strong></td>' SKIP
                     
    '      <td>' Customer.Balance FORMAT "->>>,>>>,>>9.99" '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Termos:</strong></td>' SKIP
                     
    '      <td>' Customer.terms '</td>' SKIP
                     
    '      <td align="right"><strong>Disconto:</strong></td>' SKIP
                     
    '      <td>' Customer.Discount FORMAT "->>9.99" '%</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '   <tr>' SKIP
                     
    '      <td align="right"><strong>Observações:</strong></td>' SKIP
                     
    '      <td colspan="3">' Customer.Comments '</td>' SKIP
                     
    '   </tr>' SKIP
                     
    '</table>' SKIP.

              IF 
    mostraOrdens "sim"
                 
    THEN
                     
    DO:
                        {&
    out'<div align="center">' SKIP
                               
    '   <table border="1" cellspacing="1" cellpadding="1" style="border-collapse:collapse">' SKIP
                               
    '      <tr>' SKIP
                               
    '         <td colspan="5" align="center"><b>Ordens de Compra</b></td>' SKIP
                               
    '      </tr>' SKIP.
                        
    FIND FIRST Order OF Customer NO-LOCK NO-ERROR.
                        IF 
    NOT AVAILABLE Order
                           THEN
                               
    {&out'      <tr>' SKIP
                                      
    '         <td colspan="5" align="center"><i>Cliente não possui ordens de compra</i></td>' SKIP
                                      
    '      </tr>' SKIP.
                           ELSE
                               DO:
                                  {&
    out'      <tr align="center" bgcolor="LightCyan">' SKIP
                                         
    '         <td><b>Ordem</b></td>' SKIP
                                         
    '         <td><b>Data</b></td>' SKIP
                                         
    '         <td><b>Embarque</b></td>' SKIP
                                         
    '         <td><b>Prev. entrega</b></td>' SKIP
                                         
    '         <td><b>Representante de venda</b></td>' SKIP
                                         
    '      </tr>' SKIP.
                                  FOR 
    EACH Order OF Customer NO-LOCK:
                                      IF 
    corDeFundo "#F0FFFF"
                                         
    THEN
                                             ASSIGN corDeFundo 
    "#F0F8FF".
                                         ELSE
                                             
    ASSIGN corDeFundo "#F0FFFF".
                                      
    FIND SalesRep WHERE SalesRep.Sales-Rep Order.Sales-Rep NO-LOCK NO-ERROR.
                                      {&
    out'      <tr align="center" bgcolor="' corDeFundo '">' SKIP
                                             
    '         <td>' Order.Order-Num FORMAT "9999" '</td>' SKIP
                                             
    '         <td>' Order.Order-Date FORMAT "99/99/9999" '</td>' SKIP
                                             
    '         <td>' Order.Ship-Date FORMAT "99/99/9999" '</td>' SKIP
                                             
    '         <td>' Order.Promise-Date FORMAT "99/99/9999" '</td>' SKIP
                                             
    '         <td align="left">' IF AVAILABLE SalesRep THEN SalesRep.Rep-Name ELSE Order.Sales-Rep '</td>' SKIP
                                             
    '      </tr>' SKIP.
                                  
    END.
                               
    END.
                        {&
    out'   </table>' SKIP
                               
    '</div>' SKIP.
                     
    END.
              {&
    out'<a href="' programa '">Voltar para a lista de clientes</a>' SKIP.
           
    END.

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

    /* Fim do arquivo */
    Dessa forma, teremos a tela de seleção que mostra a lista de clientes.

    [​IMG]

    E quando selecionamos (clicamos no link) um código de cliente, linkamos para o seu detalhe.

    [​IMG]

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

    Agnaldo Membro Ativo

    .

Compartilhe esta Página