Jump to content
Fivewin Brasil

Ariston Santos

Membros
  • Posts

    500
  • Joined

  • Last visited

  • Days Won

    11

Everything posted by Ariston Santos

  1. Amiguinho (imitando o Rochinha ). Acho que não entendi sua pergunta. Será que existe alguma diferente das preestabelecidas? SEFAZ Amazonas, SEFAZ São Paulo, SEFAZ Paraná, SEFAZ Virtual RS, SEFAZ Rio Grande do Sul, SEFAZ Mato Grosso, SEFAZ Mato Grosso do Sul Até onde sei, cada estado deve usar seu próprio Webservice. Os que não tiverem implantando WS próprio, utilizam SEFAZ Virtual RS.
  2. Não, mestre. Essa função faz download. O que preciso é fazer upload. Obrigado por responder.
  3. 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
  4. 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)
  5. Olá, Oribeiro. Desculpa mas estou muito atarefado esta semana. Assim que as tarefas aliviarem por aqui eu faço um exemplo simples completo.
  6. É que eu ainda não precisei fazer esse tipo de modificação. Para min sempre deu certo.
  7. Já tentou assim? WITH OBJECT oBrw:aCols[1] :bLClickHeader := {|r,c,f,oCol| NIL } END
  8. Neste trecho a fonte é redimensionada. Veja aí o que pode ser feito. 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
  9. Opa! ACTIVATE DIALOG oDlg ON INIT( oDlg:MISetSize( .T. ), oDlg:Move( 0, 0 ) ) Obrigado, Mestre.
  10. Se alguém tiver rotina melhorada, que faz manifestação de ciência e o download automático dos últimos 90 dias, e se puder compartilhar, agradeço.
  11. 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
  12. 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
  13. Olá. Precisa ser App? Ou pode ser uma página da Web? Se for App, consigo fazer para Android. Se for página da Web, consigo fazer para qualquer dispositivo. Entre em contato: ariston.ap@hotmail.com
  14. Enviei o prg com as funções que faltavam para os e-mails de quem solicitou. Ah! Neste método não dá para baixar sem certificado.
  15. Muito tempo depois... Desculpa pela demora. Me mande um e-mail que eu re respondo com os prgs anexos, contendo as funções necessárias. ariston.ap@hotmail.com
  16. Não tenho, Oscar. Carlos, No momento estou usando apenas ACBrMonitor. Você disponibilizar os .prgs e os .rc de sua rotina para UniNFe? Posso adaptá-la para ACBrMonitor e disponibilizar depois para os colegas. Se puder, envia para ariston.ap@hotmail.com Pode ser?
  17. Olá. Alguém em rotina para gerenciamento de MDF-e (cadastro, transmissão, impressão, cancelamento, etc.), via ACBrMonitor, que possa compartilhar? Grato!
  18. 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
  19. Também tenho interesse. Me coloco à disposição para ajudar no que for possível. Envie para: suporte@arsoft-ap.com.br ou ariston.ap@bol.com.br
  20. Passando só para agradecer pela dica. Muito obrigado.
  21. 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.
  22. Olá, pessoal. Estou precisando implementar o plano de contas no meu sistema. Estou fazendo pesquisas e procurando ajuda. Toda ajuda será bem vindas. Se alguém puder ajudar com ideias e código fonte, agradeço.
  23. Olá, senhores. Alguém tem uma função em xHarbour que faça isso? Este link mostra um exemplo que que preciso: http://www.macoratti.net/d130402.htm
  24. Pelo visto, sim. Também uso e desde ontem não está mais baixando.
×
×
  • Create New...