Clipper On Line • Ver Tópico - Harbour Web - Mobile via CGI

Harbour Web - Mobile via CGI

Discussão sobre outras linguagens de programação.

Moderador: Moderadores

 

Harbour Web - Mobile via CGI

Mensagempor Itamar M. Lins Jr. » 16 Jan 2020 09:38

Ola!
Macete !
Estou em fase de teste aqui, criando já o segundo site e servindo como aprendizado.
Alguns problemas em aprender Apache2(instalar/configurar) para funcionar o harbour... já venho fazendo isso há algum tempo.
O problema que apareceu aqui agora é:
Como mostrar no HTML um campo TEXT/Character com caracteres especiais ?
cDescrição := " Maria Da Silva "XYZ" "
O comando/tag em HTML <input type="text" name="cDescricao" value="Maria Da Silva "XYZ" " > isso ai não mostra corretamente em HTML "XYZ" está entre aspas.
Depois de algumas horas, criei esta função.

Function Main

cDescricao := HtmlEncode(cDescricao)

FUNCTION HtmlEncode( cString )
LOCAL cRet := hb_StrReplace( cString, { ;
      "&"   => "&amp;", ;
      '"'   => "&quot;"  , ;
      "'"   => "'" })
Return cRet


Simples!
Onde tem " (aspas) é convertido para &quot, que é mostrado corretamente no HTML.
#!/usr/local/bin/hbrun
#xcommand TEXT TO VAR <var> => #pragma __stream|<var>:=%s     
#xcommand ENDTEXT => #pragma __endtext

MemVar cEscolha, cUsuario, cIdUsuario, cCRUD, cConta, cDescricao, cGrau, cTipo, cReduzida, cCurDir
MemVar nAnterior, nRazao, nDebito, nCredito, nSaldo, cSelA, cSelB, cDig, cBrwPlano

Function Main(...)
LOCAL cEOL := + hb_eol() + hb_eol(), cHtml
PRIVATE cEscolha:="", cUsuario:="", cIdUsuario:="", cCRUD:="", cConta := "", cDescricao:="", cCurDir:="", cGrau:=""
PRIVATE cTipo:="", cReduzida:="", nAnterior:="0,00", nRazao:="0,00", nDebito:="0,00", nCredito:="0,00", nSaldo:="0,00"
PRIVATE cSelA:="", cSelB:="", cDig:="X", cBrwPlano:=""

OutStd("Content-type: text/html" + cEOL )

/*Pegar as variáveis*/
PegaVar()

RddSetDefault( "DBFCDX" )
Set autopen On
hb_cdpSelect( "UTF8" )

IF cEscolha="Achar"
   cCRUD := Procura_PC()
ELSEIF cEscolha="Gravar"
   If empty(cConta)
      return ErrorHTML( "Conta não informada." )
   EndIf   
   cCRUD := PC_Gravar()   
ENDIF

cCurDir := curdir()

cDescricao := HtmlEncode(cDescricao)

cBrwPlano := BrowsePlano()

TEXT TO VAR cHtml
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <style> body {font-family: Arial, Helvetica, sans-serif;} </style>
       
        <script src="/javascript/jquery-1.2.6.pack.js" type="text/javascript"></script>
        <script src="/javascript/jquery.maskedinput-1.1.4.pack.js" type="text/javascript" /></script>       

        <style>
           table {
           font-family: arial, sans-serif;
           border-collapse: collapse;
           width: 100%;
           }

           td, th {
              border: 1px solid #dddddd;
              text-align: left;
              padding: 8px;
           }

           tr:nth-child(even) {
           background-color: #dddddd;
           }
        </style>

                   
    </head>
   
    <body>
        <h2>Plano de Contas</h2>
        <form id="myForm" action="PlanoCta.prg" method="POST">
            <input type="hidden" name="cIdUsuario" value="&cIdUsuario" /> 
            <input type="hidden" name="cUsuario" value="&cUsuario" />
            &cDescricao
            <fieldset>
               
                Conta:<br>               
                <input type="text" style="text-align:left;" name="cConta" value="&cConta" size="16" id="cConta" required onkeypress="mascaraConta()" maxlength="12" />
               
                <button type="submit" name="cEscolha" value="Achar" formaction="PlanoCta.prg">Procurar</button>
                <br><br>
                Descrição:<br>
                <input type="" style="text-align:left;" name="cDescricao" value='&cDescricao' size="40" id="cDescricao"><br><br>
                Grau:<br>
                <input type="text" name="cGrau" value="&cGrau" size="1" id="cGrau"><br>
                <br>
                Tipo:<br>
                <select name="cTipo">
                <option value="A" &cSelA >Analítica</option>
                <option value="S" &cSelB >Sintética</option>
                </select>               
                <br><br>
                <label>Reduzida:</label> <br>
                <input type="text" name="cReduzida" maxlength="5" value="&cReduzida" size="6" id="cReduzida">
                <input type="text" name="cDig" maxlength="1" value="&cDig" id="cDig" size="1" >
                <br>
            </fieldset>
           
            <fieldset>
                Crédito:<br>
                <input type="text" style="text-align:right;" name="nCredito" value="&nCredito" size="14" id="nCredito"><br>
                Débito:<br>
                <input type="text" style="text-align:right;" name="nDebito" value="&nDebito" size="14" id="nDebito"><br>
                Saldo:<br>
                <input type="text" style="text-align:right;" name="nSaldo" value="&nSaldo" size="14" id="nSaldo"><br>

                </fieldset><br>
            <input type="submit" name="cEscolha" value="Gravar">
        </form>
        <hr>
        <label> STATUS: &cCRUD</label>     
        <script> document.getElementById(“cConta”).focus();  </script>

       <script type="text/javascript">
          $(document).ready(function(){   
            $("#cCta").mask("9.99.99.99999");
           });
       </script>
       
       <script type="text/javascript">
            function mascaraConta(){

                var cta= document.getElementById('cConta').value;
                if(cta.length==1){
                 document.getElementById('cConta').value = cta +'.';
                 }
                else if (cta.length==4){
                document.getElementById('cConta').value = cta +'.';
                }
                else if (cta.length==7){
                document.getElementById('cConta').value = cta +'.';
                }
               
                }
       </script>
       
       &cBrwPlano
       
    </body>

    </html>
ENDTEXT

OutStd( cHtml )

/*
        <!--
        <script type="text/javascript">
            function myReset() {
                    document.getElementById("myForm").reset();
            }
            MyReset();
        </script>
        --->
*/

Return ""

*******************
Function Procura_PC
*******************
*
*
LOCAL lShared := .F., cOrd, cAchou:="", cCta

IF !AbreDb('../dados/planocta.dbf','pc',lShared)
   Return ErrorHTML( "Erro abrindo arquivo: planocta.dbf" )
ENDIF

cCta := strtran(cConta,".","")

cOrd := pc->(OrdSetFocus(2)) //conta

IF pc->(DbSeeK( pad(cCta,16) ))
   //cConta      := alltrim(pc->conta)
   cDescricao  := alltrim(pc->nome)
   cGrau       := alltrim(pc->grau)
   cTipo       := alltrim(pc->tipo)
   cReduzida   := alltrim(str(val(substr(pc->reduzida,1,5))))
   nAnterior   := str(pc->anterior,2)
   nRazao      := str(pc->razao,2)
   nDebito     := str(pc->debito,2)
   nCredito    := str(pc->credito,2)
   
   nSaldo := str( ( val(nCredito) - val(nDebito) ) + val(nAnterior) , 2 )
     
   cSelA := Iif(cTipo=="A","selected","")
   cSelB := Iif(cTipo=="S","selected","")
   
   cAchou := "Conta localizada " + cConta
   cDig   := substr(pc->reduzida,6,1)
   
ELSE

   If len(cCta) == 9
      cTipo := "A"
      cGrau := "4"
   Else
      cGrau := ""
      cTipo := ""
   EndIf

   If cTipo == "A"
      cDig := mod10( strzero(val(cReduzida),5) )
   Else
      cDig := ""
   EndIf

   cDescricao  := ""
   cReduzida   := ""
   nAnterior   := "0,00"
   nRazao      := "0,00"
   nDebito     := "0,00"
   nCredito    := "0,00"
   
   nSaldo := "0,00"
   
   cSelA := ""
   cSelB := ""

   cAchou := "Conta não foi localizada " + cConta + " ---- " + str(len(cCta))
     
ENDIF

FechaDb('pc')

Return cAchou

***********************
Function PC_Gravar(...)
***********************
*
*
LOCAL lShared := .T., lIncluir, cTxt := "", cCta, cReduz

IF !AbreDb('../dados/planocta.dbf','pc',lShared)
   Return ErrorHTML( "Erro abrindo arquivo: planocta.dbf" )
ENDIF

cCta := strtran(cConta,".","")

If len(cCta) == 9
   cTipo := "A"
   cGrau := "4"   
EndIf

If cTipo == "A"
   cDig := mod10( strzero(val(cReduzida),5) )
   cReduz := strzero(val(cReduzida),5)+cDig
Else
   cDig := ""
   cReduz := ""   
EndIf

pc->(OrdSetFocus(2)) //conta
lIncluir := !pc->(DbSeek(pad(cCta,16)))

IF lIncluir
   IF Incluir('pc')
      cTxt := "Incluido a"
   Else
      Return ErrorHTML( "Erro na inclusão, planocta.dbf" )
   ENDIF
ELSE
   cTxt := "Alteração da"
   TravaRegistro('pc')
ENDIF

pc->conta      := cCta
pc->nome       := cDescricao
pc->grau       := cGrau
pc->tipo       := cTipo
pc->reduzida   := cReduz
pc->anterior   := val(nAnterior)
pc->razao      := val(nRazao)
pc->debito     := val(ndebito)
pc->credito    := val(nCredito)

cSelA := Iif(cTipo=="A","selected","")
cSelB := Iif(cTipo=="S","selected","")

cReduzida := iif(cReduz == "","",str(val(cReduzida)) )

FechaDb('pc')

Return cTxt + " Conta: " + cConta + " -- " + cDescricao

********************
Function BrowsePlano
********************
*
*
LOCAL  cHtml:="", lShared := .T.

cHtml := '<table>'
cHtml += '<tr>'
cHtml += '<th>Conta</th>'
cHtml += '<th>Descrição</th>'
cHtml += '<th>Grau</th>'
cHtml += '<th>Tipo</th>'
cHtml += '<th>Reduzida</th>'
cHtml += '</tr>'

IF !AbreDb('../dados/planocta.dbf','pc',lShared)
   Return ErrorHTML( "Erro abrindo arquivo: planocta.dbf" )
ENDIF

pc->(DbGoTop())
Do While pc->(!eof())

   cHtml += '<tr>'
   cHtml += '<td>' + pc->conta + '</td>'
   cHtml += '<td>' + pc->nome + '</td>'
   cHtml += '<td>' + pc->grau + '</td>'
   cHtml += '<td>' + pc->tipo + '</td>'
   cHtml += '<td>' + pc->reduzida + '</td></tr>'
   
   pc->(DbSkip())
EndDo
cHtml += '</table>'
Return cHtml

SET PROCEDURE TO "funcoes.prg"



Fonte completo para verem a intergração do Harbour com HTML, tudo misturado no .PRG e rodando no Ubuntu/Apache2
Aos poucos vamos abstraindo da linguagem, e entendendo os processos...Podendo depois mudar para PHP/Java/C/Perl/Python...
O importante é entender os programas que estão envolvidos e os problemas que existem e já solicionados por outros (desde muito tempo) independente de qualquer linguagem.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3911
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 137 vezes
Mens.Curtidas: 216 vezes

Harbour Web - Mobile via CGI

Mensagempor sygecom » 20 Jan 2020 12:07

Itamar,
Obrigado por compartilhar, parece bem fácil de trabalhar dessa forma. Se quiser compartilhar mais informações, como:

-Atualizar sistema, precisa que todos saim do sistema, ou consegue substituir o .EXE feito com CGI
-Consegue publicar em qualquer provedor linux/windows ?
Ou o que mais desejar comentar, que vale a pena aos todos os colegas.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6702
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 79 vezes

Harbour Web - Mobile via CGI

Mensagempor Itamar M. Lins Jr. » 20 Jan 2020 12:59

Ola!
Estou fazendo em casa.
Servidor eu mesmo peguei um CPU velho, e instalei o Ubuntu 19.

-Atualizar sistema, precisa que todos saim do sistema, ou consegue substituir o .EXE feito com CGI

Não precisa! é uma aplicação WEB. A tela está no seu Browser/Chrome/Firefox tanto faz ser no seu celular ou desktop.
Desligar/perder conexão etc... não afeta nada. Os próprios browsers restauram as telas quando congela/bug/etc..
Como o servidor é meu, não compilo os fontes fica .PRG mesmo (texto)
Basta ativar no apache o que eles chamam de "SHEBANG", linha para o interpretador de comandos. No caso do harbour é o hbrun ou o próprio hbmk2.
#!/usr/local/bin/hbrun

Chama o hbrun e roda o PRG executa como se fosse compilado.

-Consegue publicar em qualquer provedor linux/windows ?

Não/Sim para fazer isso precisamos criar o ambiente no provedor, não sei pq não uso provedores externos.
O problema não é a linguagem, mas os processos. O pessoal fala PHP/Java etc... mas não sabem configurar o apache. Como fazer o apache abrir por exemplo:
www.meuprogramacontabil.com.br
www.meuprogramaestoque.com.br
www.meuprogramalocadora.com.br
...
Abrir esses sites com um único IP externo ? Direcionar pela URL(nome) qual local vai abrir no navegado do cliente.
Por quê coloquei "não". Isso se dá devido as estruturas dos provedores, não sei se sou eu que instalo o apache neles ou já vem instalado, ou o MySQL eu instalo ou já está lá, e eu apenas crio as tabelas, entende ?
Pq se sou eu que crio o ambiente eu posso configurar o apache da forma que for preciso.
São coisas beeemmmm simples, porém eu tive que ler e ainda estou lendo muita coisa.
...
Tem uns macetes de não criar usuário com dois nomes, no ubuntu na hora de instalar/compilar o Harbour do GIT.
Isso foi na época do Victor, eu criava usuário "Itamar Lins", ai o script do Harbour falhava (acho) que criava dois diretórios ou perdia o nome da pasta do usuário.
Depois de entendido alguns processos e feita a configuração inicial. Começa o aprendizado principal que é como fazer a telas e como pegar os conteúdos das telas.

Como fazer menu!
https://www.w3schools.com/howto/howto_js_sidenav.asp
Como fazer as telas com os GET's que usamos ?
https://www.w3schools.com/html/tryit.asp?filename=tryhtml_form_submit
Basta trocar no apache o trabalho do PHP ou Harbour!
Fica rápido, muito rápido e segurança nem se fala, uma vez que a parte pesada fica ai no seu navegador.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3911
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 137 vezes
Mens.Curtidas: 216 vezes

Harbour Web - Mobile via CGI

Mensagempor sygecom » 20 Jan 2020 13:32

Itamar,
Dessa forma usando o HBRUN, não fica mais lento ? se gerar o .EXE compilado para CGI será que roda mais rapido, no meu pensamento SIM, por que já está compilado, porém para manutenção do código é mais complicado no dia a dia, ambos acredito que tem seus pontos fortes e fracos.
De qualquer forma, parabéns pela evolução junto ao Harbour, mostra o quanto da para fazer com Harbour, é sem limites esse Harbour mesmo.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6702
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 79 vezes

Harbour Web - Mobile via CGI

Mensagempor HASA » 26 Mar 2020 14:56

Poxa essa conversa tava interessante porque parou? parou porque?
Kkkkk

HASA
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1036
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 43 vezes




Retornar para Outras linguagens de programação

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro