Jump to content
Fivewin Brasil

Ariston Santos

Membros
  • Posts

    500
  • Joined

  • Last visited

  • Days Won

    11

Everything posted by Ariston Santos

  1. kleyberObrigado, mas não serve. Para INSERT eu ja tenho uma rotina que está funcinando corretamente. Já consigo inserir quantos registros novos que quiser enviando apenas uma query para o BD. O que preciso para o momento é de um exemplo para UPDATE. O motivo é que são vários registros no banco de dados. Alterar um a um via internet fica muito lento. Por isso surgiu a idéia de enviar os itens por blocos de 100. Assim, em uma tabela com mil itens, eu enviaria dez queries com 100 itens cada uma. Até um momento não consegui isso usando a SQLRDD, comandos em sql puro. Optei por enviar um a um até que surja uma dica funcional. Por enquanto, obrigado a todos pelo esforço em ajudar.
  2. Olá, pessoal. Tenho duas tabelas de estoque, uma local em DBF e outra em um servidor remoto em MySQL. Preciso periodicamente atualizar o campo ESTOQUEATUAL na tabela remota a partir do DBF local. Ja tentei assim mas não funcinou: UPDATE ITENS_DB SET ESTOQUEATUAL = 0.000 WHERE CODIGO = '0001', SET ESTOQUEATUAL = 7.000 WHERE CODIGO = '0002', SET ESTOQUEATUAL = 2.000 WHERE CODIGO = '0003', SET ESTOQUEATUAL = 5.000 WHERE CODIGO = '0004' Assim também não vai: UPDATE ITENS_DB SET ESTOQUEATUAL = 0.000 WHERE CODIGO = '0001'; UPDATE ITENS_DB SET ESTOQUEATUAL = 7.000 WHERE CODIGO = '0002'; UPDATE ITENS_DB SET ESTOQUEATUAL = 2.000 WHERE CODIGO = '0003'; UPDATE ITENS_DB SET ESTOQUEATUAL = 5.000 WHERE CODIGO = '0004' Só funciona quando eu atualizo apenas um registro por vez, mas fica muito demorado. Preciso de um exemplo que faça a atualização de vários registros via query única. Tem como? Agradeço desde já.
  3. Amigo, já tentou desativar o timer durante a verificação e reativá-lo em seguida? define timer oTimer interval 10000 action Leitura_Rac(oTimer) of oDlg_CD_RAC ... STATIC FUNCTION Leitura_Rac(oTimer) oTimer:Deactivate() ... oTimer:Activate() return .T.
  4. MUITO BOA. Só faltou uma função para realizar a conversão de caracteres de endereços URL. A DecTOWhat( Oque, ParaQue ) serviria, mas está incompleta. Alguém tem uma que faça isso? Com uma função assim é possível converter "cidade=Macap%E1" para "cidade=Macapá", ou "logradouro=D%E9cima+Nona" para "logradouro=Décima+Nona", a assim por diante. Neste link tem a tabela de caracteres em endereços URL completa, que serve de exemplo do que converter: http://www.e-planning.net/pt/suporte/codificacao_caracteres_em_url.html Se alguém se prontificar a fazer, favor postar aqui.
  5. Já trabalho com a catraca da Acesso e Soluções (http://www.acessoesolucoes.com.br/?Fuseaction=Home). A comunicação funciona via XML. Eles fornecem todo o material necessário para geração dos arquivos, simplificando muito o trabalho do programador. Basicamente funciona assim: • Para bloquear sua aplicação gera o XML de consumo; • Para liberar, gera o XML de pago. • Salva o XML numa pasta que é monitorada pela aplicação da catraca, fornecida pelo fabricante, que ler o arquivo e aplica a devida ação na catraca de saída (bloquear ou liberar). Não conheço outras catracas.
  6. Encontrei o código abaixo mas não teste. Veja se funciona aí. If GetASyncKey(18) ? 'Tecla Alt pressionada' ENDIF
  7. EU FAÇO ASSIM: SETKEY( VK_F2 , {|| ChkKeyFn("F2") }) SETKEY( VK_F3 , {|| ChkKeyFn("F3") }) DAÍ, DENTRO DA FUNCAO ChkKeyFn(cPar) REDIRECIONO PARA A FUNÇÃO APRORPIADA. FUNCTION ChkKeyFn(cKey) if GetKeyState( VK_CONTROL ) // Caso quera conjugar CTRL+F?? IF cKey = "F2" ; FuncaoDoCtrlF2() ; ENDIF IF cKey = "F3" ; FuncaoDoCtrlF3() ; ENDIF ELSEIF GetKeyState( VK_ALT ) // Caso quera conjugar ALT+F?? IF cKey = "F2" ; FuncaoDoAltF2() ; ENDIF IF cKey = "F3" ; FuncaoDoAltF3() ; ENDIF ELSE // Apenas F2 IF cKey = "F2" ; FuncaoDoF2() ; ENDIF IF cKey = "F3" ; FuncaoDoF3() ; ENDIF ENDIF RETURN NIL COMFORME VOCÊ PODE VER, PODEM SER USADAS OUTRAS TECLAS (F3, F4, ETC.) MAS PRECISA PASSAR ISSO COMO PARÂMETRO TAMBÉM.
  8. Falta alguma coisa nesta linha: oActiveX:Do( "Navigate2", "https://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8="+cChave ) Algo tipo: oActiveX:Do( "Navigate2", "https://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8&chavedeacesso="+cChave )
  9. Teste e declaração da DLL: FUNCTION TestaIncsEst() cUF:=SPACE(02) // não pode ter espaços em branco cIE:=SPACE(14) // sem ponto, sem barra, sem ifen, sem espaços, somente numero em formato de string IF ! MsgGet("UF","UF",@cUF) ; RETURN NIL ; ENDIF IF ! MsgGet("IE","IE",@cIE) ; RETURN NIL ; ENDIF oSintDll := LoadLibrary(".\DLL32\ie32.dll") IF VerificaIE(cIE,cUF) # 0 MsgAlert("Inscrição Estadual Invalida para o Estado .: " + cUF, "Inválida") ELSE MsgInfo("Inscrição Estadual válida","Ok") ENDIF freelibrary(oSintDll) RETURN NIL * Testar Inscrição Estadual com a DLL do SINTEGRA DLL32 FUNCTION VerificaIE( _cIE AS STRING, _cUF AS STRING) AS LONG PASCAL ; FROM "ConsisteInscricaoEstadual" LIB ".\DLL32\ie32.dll"
  10. Encontrei este exemplo num código aqui mas não testei. Pelo que noto em sua assinatura, você usa SQLLIB. Neste caso, é possível criar uma tabela assim como voce faz ao criar um DBF. Exemplo completo usando SQLLIB. Note que não muda quase nada: rddSetDefault('mysql') // Verificar a existência dos bancos de dados cDataBase := "nome_do_banco_de_dados" SQL := "SHOW DATABASES" // Comando para mostrar tabelas existentes Arr := SQLArray(SQL) // Executa o comando pela SQLLIB nPos := ASCAN(Arr, {|nCol| nCol[1]==cDataBase}) if nPos = 0 if ! MsgYesNo("O banco de dados "+cDataBase+" não existe. Gostaria de criá-lo?","Criar banco de dados") __Quit() endif SQL := "CREATE DATABASE "+cDataBase Arr := SQLArray(SQL) // Executa o comando pela SQLLIB endif SQL DISCONNECT ALL SET CUSTOM INDEXES ON // Conecta ao banco de dados SQL CONNECT ON cHostName; // Nome da estação ou IP do micro onde o MySQL está rodando PORT 3306; // Numero da porta, onde o servidor SQL está escutando DATABASE ALLTRIM(cDataBase) ; USER cUsrName; PASSWORD cUsrSenha ; OPTIONS SQL_NO_WARNING ; LIB 'MySQL' IF SQL_ErrorNO() > 0 MsgAlert( "Não foi possível conectar ao banco de dados! Informe esta mensagem ao suporte: "+CRLF+CRLF+SQL_ErrorMsg(), "Erro de conexão com o banco de dados") __Quit() ENDIF // Criar a tabela caixa aEstr:={} AADD(aEstr,{"CODIGO", "N", 10, 0}) AADD(aEstr,{"DATA", "C", 10, 0}) AADD(aEstr,{"HISTOR1", "C", 50, 0}) AADD(aEstr,{"HISTOR2", "C", 30, 0}) AADD(aEstr,{"SAL_ANT", "N", 10, 2}) AADD(aEstr,{"ENTRADA", "N", 10, 2}) AADD(aEstr,{"SAIDA", "N", 10, 2}) AADD(aEstr,{"SAL_ATU", "N", 10, 2}) AADD(aEstr,{"TIPO", "C", 01, 0}) AADD(aEstr,{"CD_DESP", "N", 03, 0}) AADD(aEstr,{"FECHADO", "L", 01, 0}) AADD(aEstr,{"FORMPGT", "C", 10, 0}) AADD(aEstr,{"CODOPER", "N", 03, 0}) AADD(aEstr,{"NOMOPER", "C", 40, 0}) Arr := SQLArray("SHOW TABLES") // Executa o comendo pela SQLLIB nPos := ASCAN(Arr, {|nCol| nCol[1]=="caixa"}) IF nPos = 0 DBCreate("caixa", aEstr, "mysql") USE caixa NEW VIA "MYSQL" INDEX ON DATA TO CAIXDATA INDEX ON CODIGO TO CAIXCODI INDEX ON HISTOR1 TO CAIXDESC CLOSE INDEXES CLOSE caixa IF SQL_ErrorNO() = 0 cCriado += "Tabela de caixa criada com sucesso"+CRLF ELSE MsgAlert( "Não foi possível criar a tabela de caixa!;"+; "Informe esta mensagem ao suporte : ;;"+; SQL_ErrorMsg() ) ENDIF ELSE USE caixa NEW VIA "MYSQL" aStruc2 := dbStruct() CLOSE caixa IF ToString(aEstr) <> ToString(aStruc2) if ! MsgYesNo("Foi detectado necessidade de ajuste na tabela caixa. O sistema fará o ajuste automáticamente. Este processo pode demorar vários minutos, mas não pode ser cancelado. Gostaria de fazer o ajuste agora?","Necessidade de ajuste de tabela detectado") __Quit() endif MsgRun("Alterando a estrutura da tabela. Aguarde...","Alterando...",{||SQLAlterTable( "caixa", aEstr)}) lReindex := .T. ENDIF ENDIF // Adicionando um registro static function EditCaix() LOCAL oDlg2, lSave lSave := .f. Set Order to 2 GO BOTT // Pula para o último registro wcodi := CAIXA->CODIGO + 1 // Incrementa o código wdata := DATE() wtipo := " " SKIP // Pula para o registro fantasma wcodi := CAIXA->CODIGO whis1 := CAIXA->HISTOR1 whis2 := CAIXA->HISTOR2 wentr := CAIXA->ENTRADA wsaid := CAIXA->SAIDA wdesp := CAIXA->CD_DESP Set Order to 1 DEFINE FONT oSayFnt NAME "Arial" SIZE 0, -12 BOLD ITALIC DEFINE FONT oGetFnt NAME "Arial" SIZE 0, -12 BOLD DEFINE DIALOG oDlg2 FROM 0, 0 TO 20, 76 ; TITLE If( lAppend, "Cadastro de Movimento de caixa", "Alteração Movimento de caixa" ) @05,03 TO 120,290 LABEL "Dados do movimento de caixa" PIXEL OF oDlg2 @18,10 SAY OemToAnsi("C¢digo:") SIZE 50,10 FONT oSayFnt PIXEL OF oDlg2 @18,75 GET wcodi PICTURE "9999999999" FONT oGetFnt SIZE 40,10 RIGHT WHEN (1=2) PIXEL OF oDlg2 @30,10 SAY "Data" SIZE 50,10 FONT oSayFnt PIXEL OF oDlg2 @30,75 GET wdata FONT oGetFnt SIZE 50,10 PIXEL OF oDlg2 @42,10 SAY "Tipo" SIZE 50,10 FONT oSayFnt PIXEL OF oDlg2 @42,75 COMBOBOX ocbx VAR wtipo ITEMS {OemToAnsi("CRDITO"),OemToAnsi("DBITO")} ; SIZE 50,30 OF oDlg2 ; PIXEL FONT oGetFnt @56,10 SAY OemToAnsi("C¢digo:") SIZE 50,10 FONT oSayFnt PIXEL OF oDlg2 @56,75 GET wdesp PICT "999.99" FONT oGetFnt SIZE 40,10 RIGHT PIXEL OF oDlg2 ; VALID ExistDesp(@wdesp,@whis1,@whis2,wtipo,oDlg2,1) UPDATE @55,120 BUTTON "&Pesquisar" SIZE 50,10 PIXEL OF oDlg2; ACTION ExistDesp(@wdesp,@whis1,@whis2,wtipo,oDlg2,2) @55,175 BUTTON "&Cadastrar" SIZE 50,10 PIXEL OF oDlg2; ACTION NewDbCr(@wdesp,@whis1,oDlg2,wtipo) ; WHEN (wdesp = 0) @68,10 SAY "Descricao 1" SIZE 50,10 FONT oSayFnt PIXEL OF oDlg2 @68,75 GET whis1 PICT "@!" FONT oGetFnt SIZE 150,10 PIXEL OF oDlg2 UPDATE @80,10 SAY "Descricao 2" SIZE 50,10 FONT oSayFnt PIXEL OF oDlg2 @80,75 GET whis2 PICT "@!" FONT oGetFnt SIZE 150,10 PIXEL OF oDlg2 UPDATE @92,10 SAY "Valor do credito" SIZE 70,10 FONT oSayFnt PIXEL OF oDlg2 @92,75 GET wentr PICT "@E 999,999.99" FONT oGetFnt SIZE 40,10 RIGHT PIXEL OF oDlg2; WHEN wsaid=0 .AND. SUBSTR(wtipo,1,1) = "C" @104,10 SAY "Valor do debito" SIZE 70,10 FONT oSayFnt PIXEL OF oDlg2 @104,75 GET wsaid PICT "@E 999,999.99" FONT oGetFnt SIZE 40,10 RIGHT PIXEL OF oDlg2; WHEN wentr=0 .AND. SUBSTR(wtipo,1,1) = "D" @130,100 BUTTON "&Ok" PIXEL OF oDlg2 SIZE 40, 12 ACTION ( lSave := .T. , oDlg2:End()) @130,180 BUTTON "&Cancelar" PIXEL OF oDlg2 SIZE 40, 12 ACTION ( lSave := .F. , oDlg2:End()) ACTIVATE DIALOG oDlg2 CENTERED if lSave APPEND BLANK BEGIN TRANSACTION REPL CAIXA->CODIGO WITH wcodi REPL CAIXA->DATA WITH DTOS(wdata) REPL CAIXA->HISTOR1 WITH whis1 REPL CAIXA->HISTOR2 WITH whis2 REPL CAIXA->ENTRADA WITH wentr REPL CAIXA->SAIDA WITH wsaid REPL CAIXA->TIPO WITH SUBSTR(wtipo,1,1) REPL CAIXA->CD_DESP WITH wdesp END TRANSACTION endif return nil
  11. Tem sim. Use o TINYINT(1). Exemplo: $commands[] = "CREATE TABLE `".@mysql_real_escape_string($_prefix)."chat_requests` ( `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `created` int(10) unsigned NOT NULL DEFAULT '0', `sender_system_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `sender_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `receiver_user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `receiver_browser_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `event_action_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `text` mediumtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `displayed` tinyint(1) unsigned NOT NULL DEFAULT '0', `accepted` tinyint(1) unsigned NOT NULL DEFAULT '0', `declined` tinyint(1) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_bin;";
  12. Já tive esse problema. Era rede cabeada e em alguns pontos o cabo estava com um dos fios rompido. Após correção, o problema foi resolvido. Valem também analisar as observações acima: DBCommit() após salvar os dados, etc. Além disso, não use o Sysrefresh() ao salvar dados. Ele também causa problemas se usado nesse contexto. Se precisar usar o Sysrefresh(), prefira antes da exibição de mensagens, como MsgInfo(), etc.
  13. cERes := "AVENIDA FAB" c_Nro := "100" oCida := "MACAPÁ" oUf := "AP" Show_Way( cERes, c_Nro, oCida, oUf ) *--------------- FUNCTION Show_Way( End_Clie, Nmr_Clie, Cid_Clie, Est_Clie ) If !IsInternet() Msgalert("não conectado a internet.", "Aviso!") Return nil Endif mEnd := "AVENIDA DECIMA NONA" mNmr := "1772" mCid := "MACAPÁ-AP" Ferase(GetCurDir()+"\tempgmapdist.html") // uRegPath:= "c:\test" oOle:= CreateObject("InternetExplorer.Application") oOle:Visible := .t. oOle:ToolBar := .f. oOle:StatusBar := .t. oOle:MenuBar := .f. cHtml := MemoRead(GetCurDir()+"\gmapdist.html") cHtml := StrTran( cHtml, "ORIGEM", Alltrim(mEnd)+", "+Alltrim(mNmr)+", "+Alltrim(mCid)) cHtml := StrTran( cHtml, "DESTINO", Alltrim(End_Clie)+", "+Alltrim(Nmr_Clie)+" "+Alltrim(Cid_Clie)+" - "+Est_Clie) FileWrite( GetCurDir()+"\tempgmapdist.html", cHtml ) oOle:Navigate2(GetCurDir()+"\tempgmapdist.html") hWnd:=oOle:hWnd ShowWindow(hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop(hWnd) RETURN NIL Conteúdo do gmapdist.html, que você deve gravar na pasta do seu executável com esse mesmo nome. <html><head><title>Mapa com rota</title> <script type='text/javascript' src='http://maps.google.com/maps/api/js?v=3.1&sensor=false&language=pt-BR'></script> <script type='text/javascript'> var map, geocoder; var mapDisplay, directionsService; function initialize() { var myOptions = {zoom: 15,mapTypeId: google.maps.MapTypeId.ROADMAP}; map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); geocoder = new google.maps.Geocoder(); var enderDe = "ORIGEM"; var enderAte = "DESTINO"; geocoder.geocode( { 'address': enderAte, 'region' : 'BR'},trataLocs); initializeDirections (); calcRota (enderDe, enderAte); } function initializeDirections () { directionsService = new google.maps.DirectionsService(); mapDisplay = new google.maps.DirectionsRenderer(); mapDisplay.setMap(map); mapDisplay.setPanel(document.getElementById("panel")) } function calcRota(endDe, endPara) { var request = { origin:endDe, destination:endPara, travelMode: google.maps.DirectionsTravelMode.DRIVING }; directionsService.route(request, function(response, status) { if (status == google.maps.DirectionsStatus.OK) { mapDisplay.setDirections(response) } }) } function trataLocs (results, status) { var elem = document.getElementById('msg'); if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); if (results.length > 1) { var i, txt = '<select style="font-family:Verdana;font-size:8pt;width=550px;" onchange="mostraEnd(this.options[this.selectedIndex].text);">'; elem.innerHTML = 'O endereço exato não foi localizado - há ' + results.length.toString() + ' resultados aproximados.<br />'; for (i = 0; i < results.length; i++) { txt = txt + '<option value="' + i.toString() + '"'; if (i == 0) { txt = txt + ' selected="selected"'; txt = txt + '>' + results[i].formatted_address + '</option>'; } } txt = txt + '</select>' elem.innerHTML = elem.innerHTML + txt; } } else elem.innerHTML = 'Erro no tratamento do endereço :<br /><b>' + status + '</b>'; } </script> </head> <body onload='initialize();' style='font-family:Verdana;font-size:8pt;margin:5px 0 5px 0;'> <center> <div id='map_canvas' style='width:800px;height:450px'></div> <div id='panel' style='width:550px;height:450px'></div> </center> </html>
  14. Olá amigo. Não recebi ainda. Verifique se meu e-mail está correto na sua lista de contatos. Pode ser qualquer um desses: ariston.ap@hotmail.com ariston.ap@bol.com.br admin@arsoft-ap.com.br Se possível, envie novamente. Grato.
  15. Olá, pessoal. Alguem tem a DYNAMIC SAY com a opção TRANSPARENT? Pode disponibilizar?
  16. Sim. Veja o que fiz: Negrito Itálico Sublinhado Destacado Cor diferente Para isso, usei apenas a barra de botões disponível na janela "Responder" abaixo.
  17. Olá. Estou precisando salvar vários registros de uma só vez em um banco MySQL (importação) usando SQLRDD. Como faço isso? Preciso de algo do tipo: "INSERT INTO tabela (CODIGO, DESCRICAO, VALOR) VALUES ('1', 'Descrição do item 1', '4,00'), ('2', 'Descrição do item 2', '3,00'), ('3', 'Descrição do item 3', '2,00'), ('4', 'Descrição do item 4', '1,00')" Só que já tentei acima mas não funcionou. Salvou apenas o primeiro registro. Alguma dica?
  18. Segue o código de como faço a comparação e cópia automática do EXE no servidor para a estação. Deve ser inserido antes do menu principal de sua aplicação. // Verificar se existe uma versão mais recente do EXE no servidor cDirSrv := cPasta // Endereço do executável na rede (compartilhamento) cExeName := "SISCOM.EXE" IF EMPTY(cDirSrv) ; cDirSrv := "." ; ENDIF aDire := DIRECTORY(cDirSrv+"\*.EXE") // No servidor nFile := ASCAN(aDire, {|nPos|UPPER(nPos[1])==cExeName}) IF nFile > 0 wdata1=aDire[nFile,3] wtime1=aDire[nFile,4] ENDIF aDire := DIRECTORY("*.EXE") // Localmente nFile := ASCAN(aDire, {|nPos|UPPER(nPos[1])==cExeName}) IF nFile > 0 wdata2=aDire[nFile,3] wtime2=aDire[nFile,4] ENDIF // Descomente as 3 linhas abaixo para checar por MD5 (Comente o teste por data e hora) cMd5This := HB_MD5File( cExeName ) cMd5That := HB_MD5File( cDirSrv+"\"+cExeName) IF cMd5This != cMd5That // Descomente a linha IF abaixo para testar por data e hora com tolerência de 15 minutos (Comente o teste por MD5) * IF (WDATA1 > WDATA2) .OR. (WDATA1 = WDATA2) .AND. (SECS(wtime1) > (SECS(wtime2)+SECS("00:15:00"))) // Vamos criar um .bat para fechar a aplicação, copiar o exe do servidor e executar a aplicação novamente. cDirAtu := CurDrive()+":\"+CurDir() cAtuInf := "TASKKILL /IM "+cExeName+" /F"+CRLF+; // Fecha a aplicação "XCOPY /Y /D "+cDirSrv+"\"+cExeName+" "+cDirAtu+CRLF+; // Copia o exe do servidor "START "+cExeName+CRLF+; // Executa a aplicação com o exe copiado "EXIT" // Fecha o .bat if file(cDirAtu+"\ATUALIZA.BAT") ferase(cDirAtu+"\ATUALIZA.BAT") endif arq2 := fcreate(cDirAtu+"\ATUALIZA.BAT") fwrite(arq2, cAtuInf) fclose(arq2) WAITRUN( GetEnv( "ComSpec" )+" /C START "+cDirAtu+"\ATUALIZA.BAT", 0 ) // Executa o .bat SYSWAIT(3) // Dá um tempinho par ao .bat trabalhar ELSE ferase(CurDrive()+":\"+CurDir()+"\ATUALIZA.BAT") // Não é necessário atualizar. Excluir o .bat se existir. ENDIF
  19. Como o vírus insere parte do seu código no executável, o MD5 muda sim, uma vez que esse código também leva em conta o tamanho do exe. Isso já aconteceu comigo em dois casos, clientes diferentes. O PSafe, que é um antivírus mas, particularmente, acho uma m&r#@, também modifica o MD5 do executável. Já aconteceu comigo e com a IDBrasil, que inclusive, recomenda desinstalar esse antivírus antes de instalar o OPaf (me desculpem os que o defendem). Rone O. Coura (Theotokos), já respondi seu e-mail.
  20. Para manter a integridade do executável, sempre instalo o programa completo em todos os terminais. Em cada terminal dou um SET DEFAULT TO &(cPastaDados) onde cPastaDados é o endereço da pasta de dados no servidor, conforme compartilhado na rede. Sempre comparo o MD5 do exe nas estações com o MD5 do exe no servidor, se for diferente, copio automaticamente o do servidor e sobrescrevo o da estação (Se precisar das funções que uso para isso me avise via e-mail.) Costumo deixar o servidor isolado, e com antivirus atualizado. Também sigo as normas de segurança supracitadas: Antivirus, Antispyware, Varredores de registro e cookies, para manter o servidor sempre limpo.
  21. Na verdade o ping com a opção -t fica enviando e recebendo pacote continuamente. O parâmetro -l nnn serve para definir o tamanho do buffer. A ideia acima é manter a conexão ocupada, forçando a estabilidade, pois alguns servidores "percebem" a falta de uso da conexão e a limitam para liberar o tráfego para outros usuários conectados. Se este for o caso com a Internet 3G, o ping funciona.
×
×
  • Create New...