Jump to content
Fivewin Brasil

Ariston Santos

Membros
  • Posts

    500
  • Joined

  • Last visited

  • Days Won

    11

Posts posted by Ariston Santos

  1. Boa tarde,

    Estou procurando uma solução para upload de imagens que não seja via FTP.

    A ideia é seria uma solução semelhando à demonstrada abaixo, usando a TIpLib para upload de XML via POST. Queria saber se tem como enviar imagens da mesma forma.

       cDBHst := IIF("localhost" $ c_Host, "http://"+alltrim(c_Host), "http://www."+alltrim(c_Host))
       TRY
          oURL1 := TUrl():New(cDBHst+"/"+c_Php+"?uid="+GeraIdUnico())
          oHtp1 := TIpClientHttp():New(oURL1, .F.)
          oHtp1:nConnTimeout:= 3000 // 3 segundos
          if oHtp1:Open()
             If oHtp1:POST( {{"xml", c_Xml}} ) // POST acepts long queries, xml and json.
                _Json := oHtp1:ReadAll()
             Else
             	SysRefresh() ; MsgInfo('Erro no Post ' + cDBHst, 'Aviso do Sistema')
             EndIf
          Else
             SysRefresh() ; MsgInfo("Erro na conexão com "+cDBHst+"/"+c_Php, "Atenção")
          EndIf
          try ; oHtp1:Close() ; catch e ; end try
          try ; DeleteObject(oURL1) ; catch e ; end try
          try ; DeleteObject(oHtp1) ; catch e ; end try
          DeleteUrlCacheEntry(oURL1)
       CATCH oErr
          SysRefresh() ; MsgAlert("Erro: "+oErr:Description, "Ocorreu um erro")
       END
       IF ! EMPTY(_Json)
          MsgHtml(_Json, "Retorno de "+cDBHst)
       EndIf

     

  2. Se você desejar aproveitar ao máximo a sintaxe do DBF, pode tentar assim:

    FUNCTION CriarTabelas()
       // Criação da tabela itensdel_bd
       aStr:={}
       AADD(aStr,{"CODIGO", "C", 13,  0}) // Código do item
       AADD(aStr,{"DESCRI", "C", 60,  0}) // Descrição do item
       AADD(aStr,{"DTEXCL", "D", 08,  0}) // Data da exclusão
       IF ! SR_ExistTable( "itensdel_bd" )
          TRY
             cComm := XB2SqlStr(aStr, "itensdel_bd")
             nErr := oSql:Execute( cComm )
          CATCH oErr
             SysRefresh()
             MsgAlert("Erro ao tentar criar a tabela itensdel_bd."+CRLF+CRLF+;
                      "Favor verificar as configurações de banco de dados.","Erro")
          END
       ENDIF
    RETURN NIL
    
    STATIC FUNCTION XB2SqlStr(aStr, cDBase)
       LOCAL cStrct
       cStrct := "CREATE TABLE `"+LOWER(cDBase)+"` ("
       FOR nF := 1 TO LEN(aStr)
       	 IF LOWER(aStr[nF,1]) !=  "sr_recno"
    	       IF nF > 1 ; cStrct += ", " ; ENDIF // Mais de um campo
    	       cStrct += "`"+LOWER(aStr[nF,1])+"` "+SetFType(aStr[nF,2],aStr[nF,3],aStr[nF,4])
           ENDIF
       NEXT
       IF LEN(aStr) > 0 ; cStrct += ", " ; ENDIF // Já acrescentado algum campo
       cStrct += "`sr_recno` BIGINT (15) NOT NULL UNIQUE AUTO_INCREMENT)" // Sempre criar o 'sr_recno' no final, para compatibilizar com SQLRDD
    RETURN( cStrct )
    
    STATIC FUNCTION SetFType(cTipo,nSize,nDeci)
       LOCAL cFType
       IF cTipo = "C" ; cFType := "varchar("+ALLTRIM(STR(nSize))+")"
       ELSEIF cTipo = "M" ; cFType := "mediumblob"
       ELSEIF cTipo = "N" ; cFType := "double("+ALLTRIM(STR(nSize))+","+ALLTRIM(STR(nDeci))+")"
       ELSEIF cTipo = "L" ; cFType := "tinyint(4)"
       ELSEIF cTipo = "D" ; cFType := "date"
       ENDIF
    RETURN(cFType)

     

  3. Neste trecho a fonte é redimensionada. Veja aí o que pode ser feito. :D

          IF ::aControls[I]:ofont != nil
             hFont := ::aControls[I]:ofont:hFont
             aInfo = GetFontInfo( hFont )
             oFont = TFont():New( ::aControls[I]:ofont:cFaceName, ;
                                  IIF(!lChFnt, aInfo[2], (aInfo[2]*nPorH)), (aInfo[1] * nPorV),,;
                                  ::aControls[I]:ofont:lBold, ;
                                  ::aControls[I]:ofont:nEscapement, ;
                                  ::aControls[I]:ofont:nOrientation, ;
                                  aInfo[3], ::aControls[I]:ofont:lItalic, ;
                                  ::aControls[I]:ofont:lUnderline, ;
                                  ::aControls[I]:ofont:lStrikeOut, ;
                                  ::aControls[I]:ofont:nCharSet, ;
                                  ::aControls[I]:ofont:nOutPrecision, ;
                                  ::aControls[I]:ofont:nClipPrecision, ;
                                  ::aControls[I]:ofont:nQuality, )
             ::aControls[I]:SETFONT(ofont)
          endif

    Especificamente aqui:

    IIF(!lChFnt, aInfo[2], (aInfo[2]*nPorH)), (aInfo[1] * nPorV),,;

     

    Ah. Na função DLG_RESOLUCION( oDlg ), descomente as linhas para ficar conforme abaixo, senão não será levada em consideração a barra de botões do Windows.

       nTWid := WndWidth(FindWindow( 'Shell_TrayWnd',nil))
       IF nTWid < nWidth // TrayBar position: Right or left
          nWidth -= nTWid /* Descomentada */
       ENDIF
    
       nThei := WndHeight(FindWindow( 'Shell_TrayWnd',nil))
       IF nThei < nHeight // TrayBar position: Bottom or top
          nHeight -= nThei /* Descomentada */
       ENDIF

     

  4. FUNCTION Entrada_Aux_DFe( cChave ) // --> Retorna o arquivo XML
       LOCAL cChave_CNPJ, cChave_AnoMes, cArqXML, cPathDown, cSta
       DEFAULT cChave := SPACE(44)
       IF EMPTY(cChave)
          IF ! MsgGet("Chave de acesso", "Chave de Acesso", @cChave)
             RETURN NIL
          ENDIF
       ENDIF
       IF EMPTY(cChave)
          RETURN NIL
       ENDIF
       cArqXML       := cChave + '-nfe.xml'
       cChave_CNPJ   := SUBSTR(cChave,07,14)
       cChave_AnoMes := '20'+SUBSTR(cChave,03,04)
       nPMensal      := VAL(GetPvProfString( "Arquivos", "PastaMensal", 0, cACBrFld+"\"+cACBrIni))
       cPathDown     := ALLTRIM(GetPvProfString( "Geral", "PathSalvar", "", cACBrFld+"\"+cACBrIni))+"\"+IIF(nPMensal = 1, LEFT(DTOS(DATE()),6)+"\", "\")
    
       IF File( cPathDown+cArqXML )
          IF ! MsgNoYes("O download desta NF-e já foi feito. Gostaria te fazer o download novamente?","XML já baixado")
             RETURN ""
          ENDIF
          FERASE(cPathDown+cArqXML)
       ENDIF
    
       cSta := DFe_BaixaXML( cChave )
       IF cSta == "Inoperante" ; RETURN "" ; ENDIF
       IF File( cPathDown+cArqXML )  // BAIXOU
          RETURN cPathDown+cArqXML
       ELSE    // NAO BAIXOU // MANIFESTA COMO CONFIRMACAO DA OPERACAO
          IF (cSta <> "Indisponível" .AND. cSta <> "Manifestado") // Só manifestar se ainda não manifestado.
             cRet := ""
             IF ! DFe_Manifestar(cChave, 2, @cRet) // 1 Ciencia 2 Confirmação 3 Desconhecimento 4 Operacao nao realizada
                SysRefresh(); MsgErro("ERRO: "+cRet, "Retorno do WebService")
                RETURN ""
             ELSE
                SysRefresh() ; MsgInfo("Manifestação de 'Confirmação' efetuada. O download do XML pode demorar até 5 minutos para ser liberado. Enquanto isso você pode tomar um cafezinho, ou ficar tentando novo download a cada 30 segundos.", "Manifestação pendente efetuada")
                RETURN ""
             ENDIF
          ENDIF
       ENDIF
       IF ! File( cPathDown+cArqXML )
          SysRefresh() ; MsgAlert("Download não efetuado. Aguarde 30 segundos ou mais e tente novamente. Se o erro persistir por mais de 5 minutos, solicite que seu fornecedor lhe envie o XML."+CRLF+CRLF+"Status do XML: "+cSta, "Download não efetuado")
       ENDIF
    RETURN ""
    
    STATIC FUNCTION DFe_BaixaXML( cChave )
       LOCAl cRet, lRet, cSta
       LOCAl cTpAmb := IIF(GetPvProfString("WebService", "Ambiente", "", cACBrFld+"\"+cACBrIni) = "0", "1", "2") // 1-Produção, 2-Homologação
    
       cRtr := ACBR_NFE_Modelo( "55" )
       cRtr := ACBR_NFE_Anbiente( "1" ) //  1 para Ambiente de Produção ou 2 para Ambiente de Homologação
       cRet := ACBR_NFE_DoanloadNFe(c_EUF, R_CnpjLienar(STRTRAN(nCgc,"CNPJ: ","")), cChave)
       cRtr := ACBR_NFE_Anbiente(cTpAmb) //  1 para Ambiente de Produção ou 2 para Ambiente de Homologação
    
       cSta := "Desconhecido"
       IF ("Erro Interno" $ cRet) .OR. ("Erro HTTP" $ cRet) ; cSta := "Inoperante" ; ENDIF // Falha de comunicação com o WebService
       IF ("CStat=137" $ cRet) ; cSta := "Indisponível" ; ENDIF // Documento manifestado mais ainda não disponível para download
       IF ("CStat=573" $ cRet) ; cSta := "Manifestado" ; ENDIF // Já manifestado. Duplicidade de evento
       lRet := ("CStat=138" $ cRet) // tem NFe pra chave em questao
       IF lRet ; lRet := ("tpAmb=1" $ cRet)  ; ENDIF // Emitida em Ambiente de Autorizacao
       IF lRet ; lRet := ("tpNF=1" $ cRet)  ; ENDIF // Tipo da Nota de Saida do Emitente
       IF lRet ; lRet := ("cSitNFe=1" $ cRet)  ; ENDIF // Situação AUTORIZADA
       IF lRet ; cSta := "Autorizado" ; ENDIF
    RETURN cSta
    
    FUNCTION DFe_Manifestar(cChave, nTpMan, cRet)
       LOCAL cEvt := '', lOk := .F.
       IF nTpMan >= 1 .AND. nTpMan <= 4
          cEvt += '[EVENTO]'    + CRLF
          cEvt += 'idLote=1'    + CRLF
          cEvt += '[EVENTO001]' + CRLF // Sempre 1 exceto para CC-e
          cEvt += 'chNFe='      + cChave + CRLF // Chave de acesso da NF-e
          cEvt += 'cOrgao=91'   + CRLF // Código do órgão de recepção do Evento. O código 91 para identificar o Ambiente Nacional.
          cEvt += 'CNPJ='       + R_CnpjLienar(STRTRAN(nCgc,"CNPJ: ","")) + CRLF // CNPJ do interessado no DF-e
          cEvt += 'dhEvento='   + DTOC(date())+' '+Time()+ CRLF
          cEvt += 'tpEvento='   + IIF(nTpMan = 1, '210210', IIF(nTpMan = 2, '210200', IIF(nTpMan = 3, '210220', '210240')))+CRLF
          cEvt += 'nSeqEvento=1' + CRLF // Sempre 1, exceto para carta de correção. Veja o campo HP15 (nSeqEvento) página 4 da NT 2012/002 versão 1.02
          cEvt += 'versaoEvento=1.00' + CRLF
          cEvt += 'descEvento=' + IIF(nTpMan = 1, 'Ciencia da Operacao', ;
                                    IIF(nTpMan = 2, 'Confirmacao da Operacao', ;
                                      IIF(nTpMan = 3, 'Desconhecimento da Operacao', 'Operacao nao realizada')))+CRLF
          IF nTpMan = 4 // Requer justificativa
             cEvt += 'xJust=Por motivo justivicavel a operacao legalmente acordada entre as partes nao se realizou.' + CRLF
          ENDIF
       ENDIF
       IF !EMPTY(cEvt)
          cRet := ACBR_NFE_EnviaEvento(cEvt)
          lOk := ("CStat=135" $ cRet)
       ENDIF
    RETURN lOk
    

     

  5. Uso este método da dialog.prg (modificada) que tá dando certo até o momento.

    Modo de usar: ACTIVATE DIALOG oDlg ON INIT (oDlg:MISetSize(.T.), oDlg(0, 0))

    Método declarado na dialog.prg

    METHOD MISetSize( lChFnt )

    Método definido:

    METHOD MISetSize( lChFnt ) CLASS TDialog
    
       LOCAL hDlg := ::hWnd
       LOCAL hCtrl := GetWindow( hDlg, GW_CHILD )
       LOCAL hFont, oFont, I, AINFO, aRect, nWidth, nHeight, lRepaint:=.T.
       LOCAL nPorH, nPorV, nIdControl, nPosControl
    
       DEFAULT lChFnt := .F.
       aPor := DLG_RESOLUCION( Self )
    
       nPorH := aPor[1]
       nPorV := aPor[2]
    
       if nPorh=1 .and. nPorv=1
       return nil
       endif
    
       nWidth := ::nWidth * nPorH
       nHeight:= ::nHeight * nPorV
    
       Super:SetSize( nWidth, nHeight, lRepaint )
    
       ::Move( MAX( WndTop( hDlg),1), MAX(WndLeft( hDlg),1) )
    
       **** Redimensionamento dos Controles
    
       While hCtrl != 0 .AND. GetParent( hCtrl ) == hDlg
    
          aRect := GetClientRect( hCtrl )
          nWidth := (aRect[4]-aRect[2]) * nPorH
          nHeight := (aRect[3]-aRect[1]) * nPorV
          WndSetSize( hCtrl, nWidth, nHeight, lRepaint )
          WndLeft( hCtrl, WndLeft( hCtrl) * nPorh)
          WndTop( hCtrl, WndTop( hCtrl) * nPorv)
          hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
    
       Enddo
    
       *** Redimensionamento das Fontes
    
       FOR I=1 TO LEN(::aControls)
          IF ::aControls[I]:ofont != nil
             hFont := ::aControls[I]:ofont:hFont
             aInfo = GetFontInfo( hFont )
             oFont = TFont():New( ::aControls[I]:ofont:cFaceName, ;
                                  IIF(!lChFnt, aInfo[2], (aInfo[2]*nPorH)), (aInfo[1] * nPorV),,;
                                  ::aControls[I]:ofont:lBold, ;
                                  ::aControls[I]:ofont:nEscapement, ;
                                  ::aControls[I]:ofont:nOrientation, ;
                                  aInfo[3], ::aControls[I]:ofont:lItalic, ;
                                  ::aControls[I]:ofont:lUnderline, ;
                                  ::aControls[I]:ofont:lStrikeOut, ;
                                  ::aControls[I]:ofont:nCharSet, ;
                                  ::aControls[I]:ofont:nOutPrecision, ;
                                  ::aControls[I]:ofont:nClipPrecision, ;
                                  ::aControls[I]:ofont:nQuality, )
             ::aControls[I]:SETFONT(ofont)
          endif
       NEXT
       SysRefresh()
    Return Nil
    
    FUNCTION DLG_RESOLUCION( oDlg )
       LOCAL aPor := {1,1},;
             nWidth := GetSysMetrics(0),;
             nHeight := GetSysMetrics(1)
    
       nTWid := WndWidth(FindWindow( 'Shell_TrayWnd',nil))
       IF nTWid < nWidth // TrayBar position: Right or left
          * nWidth -= nTWid
       ENDIF
    
       nThei := WndHeight(FindWindow( 'Shell_TrayWnd',nil))
       IF nThei < nHeight // TrayBar position: Bottom or top
          * nHeight -= nThei
       ENDIF
    
       nBwid := ((100/oDlg:nWidth)*nWidth)/100
       nBhei := ((100/oDlg:nHeight)*nHeight)/100
       aPor := {nBwid, nBhei}
    RETURN aPor
    

     

  6. Usando ACBrMonitor, consigo após fazer manifestação de ciência.

    FUNCTION Entrada_Aux_DFe( cChave ) // --> Retorna o arquivo XML
       LOCAL cChave_CNPJ, cChave_AnoMes, cArqXML, cPathDown, cSta
       DEFAULT cChave := SPACE(44)
       IF EMPTY(cChave)
          IF ! MsgGet("Chave de acesso", "Chave de Acesso", @cChave)
             RETURN NIL
          ENDIF
       ENDIF
       IF EMPTY(cChave)
          RETURN NIL
       ENDIF
       cArqXML       := cChave + '-nfe.xml'
       cChave_CNPJ   := SUBSTR(cChave,07,14)
       cChave_AnoMes := '20'+SUBSTR(cChave,03,04)
       nPMensal      := VAL(GetPvProfString( "Arquivos", "PastaMensal", 0, cACBrFld+"\"+cACBrIni))
       cPathDown     := ALLTRIM(GetPvProfString( "Geral", "PathSalvar", "", cACBrFld+"\"+cACBrIni))+"\"+IIF(nPMensal = 1, LEFT(DTOS(DATE()),6)+"\", "\")
    
       IF File( cPathDown+cArqXML )
          IF ! MsgNoYes("O download desta NF-e já foi feito. Gostaria te fazer o download novamente?","XML já baixado")
             RETURN ""
          ENDIF
          FERASE(cPathDown+cArqXML)
       ENDIF
    
       cSta := DFe_BaixaXML( cChave )
       IF cSta == "Inoperante" ; RETURN "" ; ENDIF
       IF File( cPathDown+cArqXML )  // BAIXOU
          RETURN cPathDown+cArqXML
       ELSE    // NAO BAIXOU // MANIFESTA COMO CONFIRMACAO DA OPERACAO
          IF (cSta <> "Indisponível" .AND. cSta <> "Manifestado") // Só manifestar se ainda não manifestado.
             IF ! DFe_Manifestar(cChave, 2) // 1 Ciencia 2 Confirmação 3 Desconhecimento 4 Operacao nao realizada
                RETURN ""
             ELSE
                SysRefresh() ; MsgInfo("Manifestação de 'Confirmação' efetuada. O download do XML pode demorar até 5 minutos para ser liberado. Enquanto isso você pode tomar um cafezinho, ou ficar tentando novo download a cada 30 segundos.", "Manifestação pendente efetuada")
                RETURN ""
             ENDIF
          ENDIF
       ENDIF
       IF ! File( cPathDown+cArqXML )
          SysRefresh() ; MsgAlert("Download não efetuado. Aguarde 30 segundos ou mais e tente novamente. Se o erro persistir por mais de 5 minutos, solicite que seu fornecedor lhe envie o XML."+CRLF+CRLF+"Status do XML: "+cSta, "Download não efetuado")
       ENDIF
    RETURN ""
    
    STATIC FUNCTION DFe_BaixaXML( cChave )
       LOCAl cRet, lRet, cSta
       cRtr := ACBR_NFE_Modelo( "55" )
       cRet := ACBR_NFE_DoanloadNFe(c_EUF, R_CnpjLienar(STRTRAN(nCgc,"CNPJ: ","")), cChave)
       cSta := "Desconhecido"
       IF ("Erro Interno" $ cRet) .OR. ("Erro HTTP" $ cRet) ; cSta := "Inoperante" ; ENDIF // Falha de comunicação com o WebService
       IF ("CStat=137" $ cRet) ; cSta := "Indisponível" ; ENDIF // Documento manifestado mais ainda não disponível para download
       IF ("CStat=573" $ cRet) ; cSta := "Manifestado" ; ENDIF // Já manifestado. Duplicidade de evento
       lRet := ("CStat=138" $ cRet) // tem NFe pra chave em questao
       IF lRet ; lRet := ("tpAmb=1" $ cRet)  ; ENDIF // Emitida em Ambiente de Autorizacao
       IF lRet ; lRet := ("tpNF=1" $ cRet)  ; ENDIF // Tipo da Nota de Saida do Emitente
       IF lRet ; lRet := ("cSitNFe=1" $ cRet)  ; ENDIF // Situação AUTORIZADA
       IF lRet ; cSta := "Autorizado" ; ENDIF
    RETURN cSta
    
    STATIC FUNCTION DFe_Manifestar(cChave, nTpMan) // 1 Ciencia 2 Confirmação 3 Desconhecimento 4 Operacao nao realizada
       LOCAL cEvt := '', lOk := .F.
       IF nTpMan >= 1 .AND. nTpMan <= 4
          cEvt += '[EVENTO]'    + CRLF
          cEvt += 'idLote=1'    + CRLF
          cEvt += '[EVENTO001]' + CRLF
          cEvt += 'chNFe='      + cChave    + CRLF
          cEvt += 'cOrgao=91'   + CRLF
          cEvt += 'CNPJ='       + R_CnpjLienar(STRTRAN(nCgc,"CNPJ: ","")) + CRLF
          cEvt += 'dhEvento=' + DTOC(date())+' '+Time()+ CRLF
          cEvt += 'tpEvento=' + IIF( nTpMan == 1, '210210', IIF( nTpMan == 2, '210200', IIF( nTpMan == 3, '210220', '210240')))+CRLF
          cEvt += 'nSeqEvento=1' + CRLF
          cEvt += 'versaoEvento=1.00' + CRLF
          cEvt += 'descEvento=' + IIF( nTpMan == 1, 'Ciencia da Operacao', ;
                                                         IIF( nTpMan == 2, 'Confirmacao da Operacao', ;
                                                           IIF( nTpMan == 3, 'Desconhecimento da Operacao', 'Operacao nao realizada')))+CRLF
       ENDIF
       IF !EMPTY(cEvt)
          cRet := ACBR_NFE_EnviaEvento(cEvt)
          lOk := ("CStat=135" $ cRet)
       ENDIF
    RETURN lOk

     

  7. Não tenho muito a contribuir, até porque mais preciso de ajuda do que posso ajudar. No entanto, tem algumas dicas que aprendi com colegas do fórum que vale a pena repassar:

    Primeiramente, no que se refere à definição de variáveis, gosto de usar o estilo “forma de camelo”, isto é, usar minúsculas e maiúsculas nas definições de variáveis.

    Por exemplo

    cObs := “” // e não cobs := “”

    Em segundo lugar, sempre endentar o código (usar espaços ou tabulação), para não parecer bagunçado e difícil de compreender, bom como inserir comentários, principalmente quando sinto que vou precisar lembrar de alguma anotação mais adiante.

    Exemplo:

    Local cObser := “” // Mostrar apenas se cObser não estiver vazia.
    IF Empty(nomeClient)
       IF Empty(cObser)
          cObser += “; “ + CRLF // Quebrar a linha caso exista mais de uma inconsistência 
       ENDIF
       cObser += “• O nome do cliente deve ser informado”
    ENDIF

    Em vez de:

    Local cObser := “”
    If Empty(nomeClient)
    If Empty(cObser)
    cObser += “; “ + CRLF
    EndIf
    cObser += “• O nome do cliente deve ser informado”
    EndIf

    E, em terceiro lugar, tomar muito cuidado com o famoso “enxugar o código”. Resumir três ou mais linhas de código em apenas, às vezes, uma é muito bom.

    Ex.1: nNumero++ // em vez de nNumero := nNumero + 1
    
    Ex.2: cImg := Iif(nPic = 3, “bmpTres”, Iif(nPic = 2, “bmpDois”, “bmpUm”))
    
    Em vez de:
    
    cImg := “”
    IF nPic = 1
       cImg := “bmpUm”
    ELSEIF nPic = 2
       cImg := “bmpDois”
    ELSE
       cImg := “bmpTres”
    ENDIF

    Mas quando se trabalha em equipe, enxugar demais pode deixar o código complicado para o entendimento dos colegas, por isso, prefira, para o bem de todos, deixar o código menos complicado possível, mesmo que isso signifique abrir mão da técnica de enxugar o código.

    Note também que eu gosto de iniciar a declaração de variáveis com uma letra que identifique o tipo de conteúdo dela:

    STATIC oXbrItn := NIL // Objeto - Ex: XBrowse() a ser definido
    LOCAL nCodigo := 0 // Numérica
    LOCAL cDesItn := Space(80) // Caractere / String
    LOCAL mDetalh := "" // Memo / String
    LOCAL dCadast := CtoD(" ") // Data
    LOCAL lLockIt := .F. // Lógica

    Por fim, conforme dá para notar acima, gosto de utilizar como boa prática algo que me permita diferenciar "Function()" de "COMMAND". Para isso, gosto de fazer bom uso das minúsculas e maiúsculas. Por exemplo, escrever Funções com iniciais maiúsculas ou usando o “estilo camelo”, e comandos com todas MAIÚSCULAS.

    É claro que nem sempre lembro de seguir todas essas regrinhas, afinal, ninguém é perfeito. Também nem toda IDE de desenvolvimento permite isso. O bom é que existem muitas IDEs com recursos de endentação automática, auto-complete e auto-case (estilo camelo automático). Com elas, esse tipo de técnica manual está sendo automatizado, permitindo a gente se concentrar mais na codificação em si.

  8. Conceito de CRC (Cyclical Redundancy Check)
    A sigla CRC (sigla da expressão inglesa Cyclical Redundancy Check e que em português é traduzida por Verificação de Redundância Cíclica) consiste num número criado por um cálculo matemático no computador fonte de um pacote de dados. Quando o pacote chega a seu destino, o cálculo é refeito. Se os resultados forem os mesmos, isso indica que os dados no pacote permaneceram estáveis. No caso do cálculo no destino diferir do cálculo na fonte, tal significa que os dados foram alterados durante a transmissão. Neste caso, a rotina CRC sinaliza o computador fonte para retransmitir os dados.

    Fonte: http://knoow.net/ciencinformtelec/informatica/crc-cyclical-redundancy-check/

     

×
×
  • Create New...