Jump to content
Fivewin Brasil

oribeiro

Membros
  • Posts

    1,291
  • Joined

  • Last visited

  • Days Won

    35

Everything posted by oribeiro

  1. Eita João, Você me ajudou muito! Só faltava colocar .T. como segundo parâmetro do hb_sha1(). // CRIAR HashCSRT // wCSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO" wChave := "41180678393592000146558900000006041028190697" codigo := wCSRT + wChave codigo1 := hb_sha1(codigo, .T.) codigo2 := HB_Base64encode(codigo1, Len(codigo1)) Msginfo( codigo1+chr(13)+chr(13)+"Modelo: aWv6LeEM4X6u4+qBI2OYZ8grigw="+chr(13)+chr(13)+"Gerado: "+codigo2, "HB_base64encode() -> Tamanho: "+str(len(codigo2)) ) Muito obrigado, mais uma vez.
  2. Pessoal, Para aumentar a segurança do sistema dentro do Terminal Server, eu criei uma rotina para abrir uma tela de explorador de arquivos onde o usuário não consegue apagar os arquivos, mas apenas selecioná-los: function xGetFiles( cMask, cTitle, nDefaultMask, cInitDir, lNova ) // Permite a seleção de múltiplos arquivos #define OFN_PATHMUSTEXIST 0x00000800 #define OFN_NOCHANGEDIR 0x00000008 #define OFN_ALLOWMULTISELECT 0x00000200 #define OFN_EXPLORER 0x00080000 // new look commdlg #define OFN_LONGNAMES 0x00200000 // force long names for 3.x modules #define OFN_ENABLESIZING 0x00800000 Local cSelect, cPath, cAux, cAux1, nAt, nFlags, lSave:=.F., aFiles := {} Default cMask := "Todos (*.*)|*.*|" Default cTitle := "Selecione o arquivo" Default nDefaultMask := 1 Default cInitDir := "" Default lNova := .F. cInitDir:= iif(Empty(cInitDir), PastaTxt(), cInitDir) if lNova // Tela nova do Windows (mas permite que o usuário apague arquivos) nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_EXPLORER, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON ) MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) }) if Len( aFiles ) > 1 for nAt := 2 to Len( aFiles ) aFiles[ nAt ] := aFiles[ 1 ] + "\" + aFiles[ nAt ] next ADel( aFiles, 1 ) ASize( aFiles, Len( aFiles ) - 1 ) endif else // Tela Antiga que limita o usuário. nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON ) MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) }) if "\ "$aFiles[1] // Se selecionou múltiplos arquivos cSelect := aFiles[1] aFiles := {} cPath := Left(cSelect, RAT("\", cSelect)) // Caminho cSelect := Alltrim(Subst(cSelect, Len(cPath)+1, Len(cSelect))) Do While "."$cSelect cAux := Left(cSelect, AT(".",cSelect)) // Nome do Arquivo cSelect := Alltrim(Subst(cSelect, Len(cAux )+1, Len(cSelect))) if " "$cSelect cAux1 := Left(cSelect, AT(" ",cSelect)) // Extenção do Arquivo cSelect:= Alltrim(Subst(cSelect, Len(cAux1)+1, Len(cSelect))) else cAux1 := cSelect cSelect:= "" endif AAdd(aFiles, cPath+Alltrim(cAux)+AllTrim(cAux1)) EndDo endif endif return( aFiles ) Agora eu preciso que os arquivos que o usuário selecionou sejam colocados na área de transferência (Ctrl+C) mas não estou conseguindo, alguém pode me ajudar? aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. ) oClp:=TClipboard():New() oClp:Clear() for i=1 to len(aFiles) oClp:SetText( aFiles[1] ) next oClp:End() Tentei assim, mas também os arquivos não foram para a área de transferência: aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. ) OpenClipboard( GetDesktopWindow() ) for i=1 to len(aFiles) SetClipboardData( 1, aFiles[i] ) next CloseClipboard()
  3. oribeiro

    HashCSRT

    Valdir, Coloquei uma função em C# noutro tópico que se alguém conseguir entender e criar uma no xHarbour o nosso problema estará resolvido.
  4. Esta incompleto. A chave está na função em C# que postei no início desse tópico. Se alguém que entende de C# puder criar uma função igual no xHarbour o problema estará resolvido.
  5. João, Li todas as suas referências mas tá difícil! Risos Ainda não cheguei no Hash de 28 caracteres que o SEFAZ exige.
  6. João, Esses valores do exemplo que passei dão certo no SEFAZ. Só não sei como calcular o hash de 28 posições que é calculado por aquele programa em C#.
  7. Estou tentando fazer isso: Passos necessários para geração do "hashCSRT" : 1) Concatenar o CSRT com a chave de acesso da NF-e/NFC-e que está sendo emitida. CSRT: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO Chave de Acesso: 41180678393592000146558900000006041028190697 Concatenada: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO41180678393592000146558900000006041028190697 2) Aplicar o algoritmo SHA-1 sobre o resultado da concatenação do passo 1, resultando em um string de 20 bytes hexadecimais. Resultado: 696bfa2de10ce17eaee3ea8123639867c82b8a0c 3) Converter o resultado do passo anterior para Base64, resultando em uma string de 28 caracteres; Resultado: aWv6LeEM4X6u4+qBI2OYZ8grigw= 4) Montar o grupo de identificação da empresa desenvolvedora do software (tag: infRespTec), com a tag "idCSRT" o identificador do CSRT utilizado para a geração do hash e a tag "hashCSRT" o resultado do passo 3. Resultado: Fonte: NT2018_005_v1_20
  8. Bom dia João, Obrigado pelo seu interesse em ajudar. Deixa eu explicar o meu objetivo com esse algorítmo em C# : Estou planejando as mudanças que virão na NF-e com a inclusão dos dados do desenvolvedor. A primeira parte da conversão eu consegui com o comando: hb_sha1( codigo_exemplo ) que funciona perfeitamente e me retorna a chave "696bfa2de10ce17eaee3ea8123639867c82b8a0c" depois disso eu preciso converter essa chave para Base64 mas o problema é que o comando HB_Base64encode( "696bfa2de10ce17eaee3ea8123639867c82b8a0c" ) retorna "Njk2YmZhMmRlMTBjZTE3ZWFlZTNlYTgxMjM2Mzk4NjdjODJiOGEwYw==" e eu preciso que retorne "aWv6LeEM4X6u4+qBI2OYZ8grigw=". Achei num fórum esse algoritmo em C# que pega o resultado do HB_Base64encode() e gera o código que eu preciso, mas não estou conseguindo fazer essa rotina em xHarbour. Você conhece alguma função que faça isso?
  9. Pessoal, Alguém, por favor, consegue converter essa função C para uso no xHarbour? private static string ToBase64Hex(string value) { int countChars = value.Length; byte[] bytes = new byte[countChars / 2]; for(int i = 0; i < countChars; i+=2) { bytes[i / 2] = Convert.ToByte(value.Substring(i, 2), 16); } return Convert.ToBase64String(bytes); }
  10. Aí João, Resolveu 100%. Muito obrigado.
  11. Tranquilo Motta. Obrigado mesmo assim. Vou tentar de outra forma.
  12. Coloquei no meu servidor Windows Server 2008 R2 e funcionou perfeitamente. Daí eu coloquei o executável no servidor do meu cliente que é a mesma versão do Windows e deu o seguinte erro: Erro irrecuperável 9003: Muitas chamadas recursivas ao manipulador de erros.
  13. Valeu Motta, Mas como eu faço a chamada somente da função ExitWindowsEx para fazer apenas o LogOff?
  14. Pessoal, Quero dar um LogOff no usuário do terminal server assim que ele fechar o sistema. Tem como fazer isso?
  15. Eu trabalho com ACBrNfeMonitor.exe executando em segundo plano. Existe uma forma de trabalhar com ACBr através de LIB ?
  16. Pessoal, Existe algum comando que me retorna o mome do arquivo em vez de o Alias? Exemplo: USE CLIENTES ALIAS CLI ? Alias() // Retorna: CLI ? Dbf() // Retorna: CLI Preciso de um comando que retorne: CLIENTES
  17. Pessoal, Estou trabalhando com arquivos temporários em memória com o hb_dbcreate() assim: ///////////////////////////////////////////////// // Arquivo Temporário, no xHarbour 1.2 Somente // // Cria o Arquivo na memória (não usa o Disco) // ///////////////////////////////////////////////// Local _DbfTemp[1]:="ARQTEMP" Hb_DbCreate(_DbfTemp[1],{{ "Nombre", "C", 40, 0 },; // -> Criação do Memory File Temporary com Hb_DbCreateTemp() { "Direccion", "C", 50, 0 },; { "Telefono", "C", 12, 0 },; { "Edad", "N", 2, 0 },; { "Productos", "C", 10, 0 },; { "Nivel", "N", 2, 0 }}) // Seleciona o Arquivo criado na memória e usa os comandos comuns de tratamento dos registros // Select(_DbfTemp[1]) OADbAppend() replace nombre with "Oscar Ribeiro" replace Direccion with "RUA MARCIA PIERRONI, 99" replace Telefono with "55 11 4025-1234" DbAppend() replace nombre with "Marco Ribeiro" replace Direccion with "RUA MARCIA PIERRONI, 99" replace Telefono with "55 11 4025-1234" DbAppend() replace nombre with "Oscar Ribeiro Neto" replace Direccion with "RUA MARCIA PIERRONI, 99" replace Telefono with "55 11 4025-1234" browse() // Cria o indice do arquivo também na memória // index on nombre to clientes Memory Seek "Marco Ribeiro" browse() // Fecha o arquivo e Apaga da Memória // (_DbfTemp[1])->(DBCLOSEAREA()) oaDbDrop("MEM:"+_DbfTemp[1]) Entendi que quando fecho o arquivo com DbCloseArea() o arquivo ainda continua na memória, porque eu consigo abrí-lo novamente com DbUseArea() mas preciso saber se existe algum comando que verifica se o arquivo ainda está lá. Por exemplo, se o arquivo é físico eu uso FILE("ARQTEMP.DBF"), mas com arquivo de memória, existe algum comando similar ao FILE() que verifica se ele está lá?
  18. Valeu Jorge. O código que o Sputnik enviou resolve meu problema. Eu só mandei o exemplo para o João porque ele não estava entendendo o que eu queria. Mas está resolvido. Obrigado.
  19. Sputnik, Valeu pela dica em SQL. Vou usar o seu código.
  20. Obrigado João, Mas essa função retorna a quantidade de campos de uma tabela, eu preciso do número de registros ativos dela. FCount: - The function returns a numeric value which is the number of field variables available in a work area. If a work area is not used, the return value is zero.
  21. Pessoal, Existe no xharbour alguma função que retorne apenas o número de registros filtrados numa tabela? O RecCount() e o LastRec() retornam o total de registros na tabela sem considerar o Scope nem o Filter. Existe algum outro comando que faça isso? Eu desenvolvi a função abaixo para fazer isso, mas se tiver um comando nativo é mellhor: ******************************************************************************************** Function oaRecCount() // Calcula o número de registros ativos no arquivo (considera ordscope, setfilter, etc.) ******************************************************************************************** Local nRec := 0 Local nReg if Used() nReg := RecN() DbGoTop() Do While !Eof() SysRefresh() nRec = nRec + 1 DbSkip() EndDo DbGoTo( nReg ) endif Return( nRec )
  22. Pablo, Muito obrigado pelo seu comentário otimista sobre o SQLRDD. Estou com a minha aplicação quase que 100% funcional com ele e estou gostando, tenho apenas algumas situações estranhas como a que mencionei na mensagem inicial desse tópico, mas aos poucos estou conseguindo driblá-las. Vou seguir com essa ferramenta porque foi a única forma que encontrei para mudar sem ter que reescrever muitos códigos que estão funcionando muito bem com DBFCDX. Um abraço e votos de sucesso. Oscar Ribeiro
  23. Eu também sou fã do DBF, mas não tem mais como fugir desse tal do SQL.
×
×
  • Create New...