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

003 - Olá Mundo

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

  1. Agnaldo

    Agnaldo Membro Ativo

    Tempo estimado de leitura: menos de 10 minutos


    Nós temos três estilos/técnicas/formas de programação.
    • HTML Mapeado
    • SpeedScript
    • CGI Wrapper
    Cada um tem seus prós e contras.
    Iremos falar sobre eles mais adiante.

    Por enquanto, no nossos exemplos, usaremos a técnica de CGI Wrapper.

    No CGI Wrapper, nós usamos a 4GL para “gerar” a saída HTML, a nossa página.

    Uma página HTML, que mostre o conteúdo “Olá Mundo”, tem um conteúdo semelhante a esse:
    HTML:
    <html>
    <head>
    <title>Exemplo</title>
    </head>
    <body>
    Exemplo Olá Mundo
    </body>
    </html>
    
    Se quisermos “compactar” um pouco, podemos colocar na forma de uma linha, uma vez que para o HTML, a disposição do código é irrelevante.
    HTML:
    <html><head><title>Exemplo</title></head><body>Exemplo Olá Mundo</body></html>
    Mas para nós, programadores, ter o conteúdo identado parece ser um pouco mais decente, elegante e legível.
    HTML:
    <html>
        <head>
            <title>Exemplo</title>
        </head>
        <body>
            Exemplo Olá Mundo
        </body>
    </html>
    
    O que precisamos, então, é gerar com a 4GL o nosso conteúdo, visto acima.

    A primeira coisa que precisamos entender é que WebSpeed e/ou StarWeb FrameWork não são linguagens.
    Quando dizemos “Ele programa em WebSpeed” damos a impressão que WebSpeed é uma linguagem, quando na verdade não o é.
    WebSpeed (assim como o StarWeb FrameWork) é um conjunto de funções (funcionalidades) escritas em 4GL, somado a um ambiente de execução.
    Ou seja, você não programa em WebSpeed. Você programa em 4GL “usando” as funções “que alguém” escreveu, em 4GL, sobre um certo ambiente.

    Tendo isso em mente, uma das primeiras coisas que nosso programa precisa é “ter” essas funções para web.
    Tais funções estão declaradas na “include” wrap-cgi.i, que esta na PROPATH do Progress.

    Nosso programa começa, então, definindo essa include.
    PHP:
    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}
    Quando o browser (cliente) faz uma chamada para o servidor web, informando a URL de uma página, o servidor web sabe que recurso será buscado.

    Por exemplo, na URL http://teuServidor/teste.html, o browser invoca a URL, enviando assim um "requisição" para o servidor web, que a atende.
    O servidor web, IIS, Apache, etc., reconhece que “teste.html” é um “recurso” que ele possui, um arquivo.
    Ele vai no disco então, pega tal arquivo e devolve para o browser.
    O servidor web sabe que tipo de arquivo (mime type) esta sendo usado, pois é ele que vai no disco e pega o conteúdo.
    Mas quando temos um “programa” sendo executado, é diferente.
    Por exemplo: a URL http://teuServidor/teste.html esta buscando uma página estática, que é diferente de uma URL típica do ambiente WebSpeed, que seria algo como:
    Código:
    http://teuServidor/scripts/cgiip.exe/WService=wsbroker1/meuPrograma.p
    
    Notem, estamos invocando um programa executável (cgiip.exe) e esse por sua vez irá chamar o serviço (broker) wsbroker1 do WebSpeed pedindo que tal serviço rode o programa Progress “meuPrograma.p”.
    Provavelmente o programa irá devolver algo para o servidor web, que por sua vez devolve para o cliente (browser).
    Acontece que o programa devolve para o servidor web um “monte” de bytes.
    O servidor web não sabe o que são/para que servem esses bytes.
    Poderiam ser bytes que montam um PDF, bytes que montam uma imagem, um arquivo de som, um arquivo texto, etc.
    É responsabilidade então do programa que esta sendo executado devolver uma seqüência de “bytes mágicos” que informe isso ao servidor web.

    Dentro da include wrap-cgi.i existe uma função, output-content-type, que pode ser chamada para realizar tal ação.
    A sintaxe dela poderia ser, entre outras:
    output-content-type("text/text"). Para indicar ao servidor web que os bytes que ele vai receber são para montar o equivalente a um aquivo texto, ou
    output-content-type("text/xml"). Para indicar que é um conteúdo XML.
    E assim vai...

    No nosso caso, precisamos informar que nosso programa esta enviando bytes para o servidor web para montar uma página HTML.
    Nosso programa “ola mundo” poderia então ter algo assim:
    PHP:
    /* Include com as funcionalidades web */
    src/web/method/wrap-cgi.}

    /* Gera o header html */
    output-content-type("text/html").
    Com isso, nosso programa, se executado, estaria gerando uma página em branco como resposta, pois o servidor web vai enender que os bytes que ele esta recebendo do programa em uso são para montar uma pagina html.

    Mas o que queremos é montar uma página HTML com conteúdo.
    Precisamos então dar DISPLAY do que queremos.

    DISPLAY é um comando da 4GL Progress que gera dados formatados em frames.
    PUT permite uma saída sem o uso de frames.
    PUT UNFORMATTED é uma forma melhor para gerar dados “brutos”, sem formatação alguma.

    WebSpeed trabalha com STREAM para gerar a saída.
    Usariamos então algo como PUT STREAM meuStream UNFORMATTED.

    Para facilitar a vida, na include wrap-cgi.i existe a definição de um pré-processor para nos ajudar.
    Ele se chama {&out}.
    Então, o pré-processor {&out} equivale ao nosso display, ou melhor, a um put unformatted.

    Agora já temos, então, o suficiente para gerar nossa página HTML do Olá Mundo.
    Para gerar a página
    HTML:
    <html><head><title>Exemplo</title></head><body>Exemplo Olá Mundo</body></html>
    
    Podemos ter um programa assim:
    PHP:
    src/web/method/wrap-cgi.}
    output-content-type("text/html").
    {&
    out'<html><head><title>Exemplo</title></head><body>Exemplo Olá Mundo</body></html>'.
    Mas talvez assim ficasse melhor:
    HTML:
    <html>
    <head>
    <title>Exemplo</title>
    </head>
    <body>
    Exemplo Olá Mundo
    </body>
    </html>
    
    Então, podemos fazer:
    PHP:
    src/web/method/wrap-cgi.}
    output-content-type("text/html").
    {&
    out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP
           
    'Exemplo Olá Mundo' SKIP
           
    '</body>' SKIP
           
    '</html>' SKIP.
    Mas para nós, programadores, ter um código identado e comentado fica mais elegante.
    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>Exemplo</title>' SKIP
           
    '</head>' SKIP
           
    '<body>' SKIP(1).

    /* Conteúdo da página html */
    {&out'Exemplo Olá Mundo' SKIP(1).

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

    /* Fim do arquivo */
    Uma vez que nosso programa esta escrito no estilo CGI-Wrapper, podemos usar o editor do Progress para escreve-lo. Dessa forma, podemos aproveitar o recurso do editor que realça os comandos (pinta as letras).
    Como CGI-Wrapper nada mais é do que um programa 100% 4GL, podemos usar Shift-F2 para testar a sintaxe dele à medida que escrevemos o código.

    Enfim, é apenas mais um programa em 4GL Progress sendo escrito no editor do Progress.

    Podemos enriquecer um pouco mais nosso exemplo, colocando algumas coisas a mais do HTML
    PHP:
    DEFINE VARIABLE nomeDoSite 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").


    ASSIGN corDeFundo "#FFFFCC"
           
    nomeDoSite "Forum 4each".

    /* Abre a página html */
    {&out'<html>' SKIP
           
    '<head>' SKIP
           
    '<title>Exemplo</title>' SKIP
           
    '</head>' SKIP
           
    '<body bgcolor="' corDeFundo '">' SKIP(1).

    /* Conteúdo da página html */
    {&out'Exemplo para o <b>' nomeDoSite '</b><br>' SKIP
           
    '<i>' STRING(TODAY,"99/99/9999"' - ' STRING(TIME,"HH:MM:SS"'</i>' SKIP
           
    '<hr>' SKIP.

    {&
    out'<h1>Exemplo Olá Mundo</h1>' SKIP(1).

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

    /* Fim do arquivo */
    Deverá nos dar algo parecido com isso:

    [​IMG]


    Notem que CGI-Wrapper é bastante simples e, principalmente, bastante 4GL, ou seja, é apenas mais um programa em 4GL.

    Abaixo temos, apenas para citar, o mesmo exemplo, mas dessa vez escrito em SpeedScript.

    HTML:
    <script language="Speedscript">
        DEFINE VARIABLE nomeDoSite AS CHARACTER.
        DEFINE VARIABLE corDeFundo AS CHARACTER.
    
        ASSIGN corDeFundo = "#FFFFCC"
               nomeDoSite = "Forum 4each".
    
    </script>
    <html>
    <head>
    <title>Exemplo</title>
    </head>
    <body bgcolor="`corDeFundo`">
    Exemplo para o <b>`nomeDoSite`</b><br>
    <i>`STRING(TODAY,"99/99/9999")` - `STRING(TIME,"HH:MM:SS")`</i>
    <hr>
    <h1>Exemplo Olá Mundo</h1>
    </body>
    </html>
    

    Curtiu?
    Até o próximo post.​
    Última edição: Janeiro 21, 2014
  2. renato luzzim bargas

    renato luzzim bargas Sem Pontuação

    muito bom esse post, parabéns.
    eu consigo ao click em um button de uma window direcionar o cliente ao um site especifico ?
    se sim,você poderia me mostrar os caminhos,pois estou tentando fazer isso através do comando OUTPUT .
    devo lhe dizer que meus conhecimentos em progress ainda são de iniciantes.
    grato .
  3. Agnaldo

    Agnaldo Membro Ativo

    eu consigo ao click em um button de uma window direcionar o cliente ao um site especifico ?

    Se for um button de uma pagina html, podes fazer um evento de onclick nele.
    É simplesmente um link apontando para alguma URL.

    Se for um button de uma tela de Progress gráfico, deves usar uma chamada para um shellExecute.

    Qual seria a situação?
  4. renato luzzim bargas

    renato luzzim bargas Sem Pontuação

    estou criando uma window e nela gostaria de anexar um button para dereciona-la para o site da empresa.
    o button é em tela de progress gráfico.
    irei te mandar imagen
    upload_2014-8-27_10-5-46.png

    gostaria de ligar esse button A2 ao site da empresa.
    obrigado
  5. Agnaldo

    Agnaldo Membro Ativo

    PHP:
    DEFINE VARIABLE linhaURL AS CHARACTER.
    DEFINE VARIABLE retorno  AS INTEGER.

    ASSIGN linhaURL "http://www.google.com.br".

    RUN ShellExecuteA (0,"open",linhaURL,"","",1,OUTPUT retorno).
            

    PROCEDURE ShellExecuteA EXTERNAL "shell32" :
         
    DEFINE INPUT PARAMETER HWND AS LONG.
         
    DEFINE INPUT PARAMETER lpOperation AS CHAR.
         
    DEFINE INPUT PARAMETER lpFile AS CHAR.
         
    DEFINE INPUT PARAMETER lpParameters AS CHAR.
         
    DEFINE INPUT PARAMETER lpDirectory AS CHAR.
         
    DEFINE INPUT PARAMETER nShowCmd AS LONG.
         
    DEFINE RETURN PARAMETER hInstance AS LONG.
    END.
  6. renato luzzim bargas

    renato luzzim bargas Sem Pontuação

    muito obrigado Agnaldo

Compartilhe esta Página