Leaderboard


Popular Content

Showing most liked content since 04/29/20 in all areas

  1. 4 likes
    Jânio Faço assim também, mas sem criar nenhuma variável e nenhum objeto. Coloco este código no Before Printing BODY do report: IF modulo(MyReport..NbRecRead, 2) = 0 THEN MySelf..BrushColor = RGB(230, 230, 230) ELSE MySelf..BrushColor = Transparent END
  2. 4 likes
    Em parceria com a WX Informática estamos disponibilizando o Workshop inteiramente grátis, e com o objetivo de ajudar o grupo estarei dando continuidade no temas com novas aulas totalmente free, fiquem de olho em breve novos vídeos serão disponibilizados, espero que gostem. Links dos vídeos e projeto exemplo: http://leonardo-vilani.blogspot.com/
  3. 4 likes
    Resolvido Rinaldo, alterei de WM_KEYDOWN para WM_SYSKEYDOWN Ficou assim a captura do evento: Event("tecla_pressionada", "*.*", WM_SYSKEYDOWN) agora tá funcionando 100% Obrigado
  4. 4 likes
    Janio Você pode capturar a tecla pressionada e na janela verificar qual o objeto que está com o foco. Neste caso no INITIALIZING do projeto você coloca: // Carrega os arquivos das constantes do WinDev EXTERN "KeyConst.WL" EXTERN "WinConst.WL" // Verifica o pressionamento de uma tecla Event("TeclaPressionada", "*.*", WM_KEYDOWN) E depois cria uma procedure mais ou menos assim: PROCEDURE TeclaPressionada() // Verifica se a tecla F2 foi pressionada e se a janela está ativa IF KeyPressed(VK_F2) AND WinStatus(WIN_xxxx) = Active THEN // Verifica qual objeto está com o foco ... Seu código ... END
  5. 4 likes
    Pode ser assim também, sem usar a função IIF(): PROCEDURE NumeroMeses(LOCAL dDataInicial, LOCAL dDataFinal) nContador is int = 0 WHILE dDataInicial <> "" AND dDataInicial < dDataFinal dDataInicial..Month++ IF dDataInicial <= dDataFinal THEN nContador++ END END RESULT nContador
  6. 3 likes
    Como você está dentro do exception, basta forçar o desvio indicando que uma exceção ocorreu, assim não precisa nem do seu contador Altere a linha "IF HModify(a16cid) = False THEN nContaErro++" para "IF HModify(a16cid) = False THEN ExceptionThrow(1)" Dessa maneira está sendo indicado manualmente que ocorreu uma exceção neste ponto do código e o fluxo vai ser desviado para o DO, onde você pode por exemplo, cancelar as transações https://help.windev.com/en-US/?3034005&name=ExceptionThrow
  7. 3 likes
    Você gostaria de traduzir os menus AAF do Windev? Os Popups dos controles tabela? As mensagens e avisos? Veja neste PDF como realizar isto https://www.dropbox.com/s/pqfez102vj14dcb/wedevtraduzir.pdf?dl=0
  8. 2 likes
    CntxBase is Connection HDescribeConnection(CntxBase,"","",EDT_CAMIMPORTA,"",hNativeAccessXBase,hOReadWrite,"OEMTOANSE=WINDOWS") HChangeConnection("*",CntxBase) // Renomenado arquivos para operar importação sem problemas com outro sistema em uso IF fFileExist(EDT_CAMIMPORTA+"\CLIENTES.DBF") THEN fRename(EDT_CAMIMPORTA+"\CLIENTES.DBF", EDT_CAMIMPORTA+"\CLIENTES2.DBF") END // Preparando um Select para uso com o DBF dsDDbfReq is Data Source sMyQryCli is string = [ Select CLICONTR, CLINOME, CLIAPEL, CLICAD, CLINASC, CLIEND, CLINUM, CLIBAI, CLICID, CLIUF, CLICEP, CLITEL1, CLITEL2, CLICEL, CLIPAI, CLIMAE, CLICIVIL, CLIRESID, CLIPROFI, CLIPESCA, CLICPF, CLIRG, CLICTRAB, CLISERIE, CLIPIS, CLIRESER, CLITITUL, CLIZONA, CLISECAO, CLINIT, CLIRGPSE, CLIDTRSE, CLIINSC, CLITEST1, CLITEST2, CLITEST3, CLISITU, CLIFOTO, CLIEMAIL, CLIOBS, CLIQTDPA, CLIDIABA, CLIDTBOL, CLIFIXAR, CLIREGI, CLINTDEP, CLIQTEMI FROM CLIENTES2 ] sMyQryCli = StringBuild(sMyQryCli) HDBOpen("CLIENTES2","",EDT_CAMIMPORTA+"\CLIENTES2.DBF") //OpenSister(IW_Aguarde) IF HExecuteSQLQuery(dsDDbfReq,CntxBase, sMyQryCli) THEN FOR EACH dsDDbfReq // Aqui você trata e salva os dados no seu banco HFSQL Next END // Fechando conexão DBF HCloseConnection(CntxBase)
  9. 2 likes
    @Janio Aguiar Aproveitei sua pergunta para estudar e tentar aprender.. Fiz assim. No report, criei uma vari[avel para ser um contador de registro. em Reading the data of SEUREPORT gnLinha = gnLinha + 1 Coloquei um Shape sem borda e com cor de fundo , posicionado atras dos controles do relatório; e no codigo desse shape fiz assim. IF modulo(gnLinha,2)=1 THEN SHP_SHAPE6..Visible = True ELSE SHP_SHAPE6..Visible=False END Funcionou...
  10. 2 likes
    Na solução que utilizo não me importo com qual terminal e sim com o total de acessos simultâneos, logo a cada login faço as anotações e por um simples count(*) eu tenho o total de logins. A desvantagem é que tive de colocar um recurso parra baixar os logins quando o usuário não fecha a aplicação e simplesmente desliga o windows. Em tempo, a quantidade de terminais fica anotado dentro de um registro de ADM dentro do próprio BD, a diferença é que tem um hash de todas as colunas e se o cliente for direto e alterá-la a aplicação inteira para porque o hash passa a não conferir. []´s
  11. 2 likes
    Código abaixo pra saber nr de série da placa mãe. objLocator is object Automation "WbemScripting.SWbemLocator" objService is object Automation dynamic Results is object Automation dynamic WHEN EXCEPTION IN objService = objLocator>>ConnectServer(".", "root\cimv2") objService>>Security_>>ImpersonationLevel = 3 // Motherboard infos Results = objService>>ExecQuery("SELECT Manufacturer, Product, Version, SerialNumber FROM Win32_BaseBoard") FOR x = 0 _TO_ Results>>Count -1 Trace("Manufacturer : ",Results>>ItemIndex(x)>>Properties_("Manufacturer")>>Value ) Trace("Product : ",Results>>ItemIndex(x)>>Properties_("Product")>>Value ) Trace("Version : ",Results>>ItemIndex(x)>>Properties_("Version")>>Value ) Trace("SerialNumber : ",Results>>ItemIndex(x)>>Properties_("SerialNumber")>>Value ) Trace("=========================") END DO Error("Erreur execution WMI",ExceptionInfo(errInfo)) ExceptionEnable() END RETURN
  12. 2 likes
    Depois de apanhar igual a "mulher de bandido" e mais alguns dias de estudo, cheguei ao consenso sobre a certificação digital sobre o arquivo PDF. Na realidade tanto faz se for utilizar A1 ou A3, o ponto está em permitir que o usuário escolha com qual certificado ele irá utilizar. Então vejamos: MyCertificate is Certificate = CertificateSelect() IF MyCertificate..Name = "" THEN RETURN END MySignature is pdfSignature MySignature..Certificate = MyCertificate Não há necessidade de informar nem o arquivo PFX e muito menos a senha, pois ao tentar selecionar o próprio Windows se encarrega dessa parte. se Name retornar vazio, é porque o usuário escolheu cancelar ao invés de ter selecionado algum certificado. Fiz muitos testes e todos vieram a contento e a imagem ficou muito legal dentro do PDF, contudo não consegui dar uma boa opacidade. Abraços
  13. 2 likes
    nesse caso não, as funções H ja tem seu tratamento próprio, casos de erro na função H voce identifica com o retorno False e mensagem HerrorInfo() só entra no exception se tiver erro na sintax outra observação HerrorInfo() dentro do exception voce não vai ter a mensagem correta, o correto é exceptionInfo()
  14. 2 likes
    basta declara no Set das procedures, mas é claro que precisa separar suas procedures em Sets diferentes https://www.screencast.com/t/oMJXS3OT16N
  15. 2 likes
    Eu faria assim Janio. NextTitle("ATENÇÃO!") IF Open(WIN_YesNo,""CONFIRMA INCLUSÃO?",1) = 1 HReset(a16tdc) a16tdc.IS_DELETED = "N" a16tdc.CODIGO = EDT_Codigo a16tdc.NOMDOC = NoAccent(EDT_NomDoc) IF HADD(a16tdc) = True THEN ToastDisplay("REGISTRO INCLUIDO COM SUCESSO",toastShort,vaMiddle,haCenter) ELSE NextTitle("ATENÇÃO") Error("ERRO AO SALVAR REGISTRO"+ CR +HErrorinfo(hErrorMessage) ) RETURN END END
  16. 2 likes
    SELECT v.datmov, COALESCE(SUM((CASE WHEN v.Cancelado = 'S' THEN tot_ven ELSE 0 END)),0) AS CANCELADO, COALESCE(SUM((CASE WHEN v.Cancelado= 'N' THEN tot_ven ELSE 0 END)),0) AS NORMAL FROM VENDAS v WHERE v.datmov between '01/01/2020' and '01/31/2020' GROUP BY v. datmov
  17. 2 likes
    Eu faria algo bem mais simples, quando o EDT ganhar o Foco, você colaca no Caption do botão de consulta "CONS PRODUTOS" e quando o EDT do Cliente ganhar o foco você colocar no Caption "Cons Clientes". Então no botão de consulta você verifica se estiver escrito Clientes ou Produtos. A vantagem dessa técnica é que no caption você prepara o seu usuário para ir exatamente ao que estiver indicado no botão. []´s
  18. 2 likes
    Boa tarde, Obrigado pelo retorno, pessoal! Na verdade a solução é mais simples que eu podia imaginar: - Eh so colocar no evento "KEY DOWN" do EDT o teste da tecla pressionada, e se for F2 desviar para o botao correspondente No evento KEY DOWN do Edt_CodigoCliente IF KeyPressed(VK_F2) THEN ExecuteProcess(BTN_ProcuraCliente,trtClick) END No evento KEY DOWN do Edt_CodigoVendedor IF KeyPressed(VK_F2) THEN ExecuteProcess(BTN_ProcuraVendedor,trtClick) END
  19. 1 like
    Boa tarde, Como fazer um relatório (ligado a uma query) zebrado? Janio
  20. 1 like
    Bom Dia, Temos algumas situações. O mecanismo de relacionamento utilizado nos SGBD normalmente contemplam a obrigatoriedade de que TODOS os filhos tenham pais. Isso para manter a consistência das regras. Em sua grande parte funciona que é uma beleza, mas tem algumas situações em que precisamos utilizar de nossa criatividade. A primeira ideia para manter a consistência temos de definir, em caso de alteração da chave o que o SGBD deve providenciar, regravar em todos ou ainda remover os filhos e finalmente em caso de exclusão do pai o que fazer com os filhos. Essa regra denominamos de "INTEGRIDADE RELACIONAL" e muitos confundem com relacionamento de relatório. Vamos a para alguns casos práticos. Pedido, Itens e parcelas. Identificando o Pai, PEDIDO, tem seus filhos ITENS e PARCELAS. Se eu remover o pedido, espero que não fique qualquer "lixo" ou seja de nada me adianta eu ter itens de pedidos inexistentes e o mesmo procedimento para com as parcelas. Agora o seu caso prático, documentos de clientes para órgãos emissores. Se remover um órgão emissor, claro que não quero que seus filhos sejam excluídos, então com toda a segurança devo informar ao SGBD que é a regra é RESTRITA, ou seja, se tentar remover e o cara tiver um único filho que o utilize, impeça tal exclusão. E como fazer para aqueles documentos que não tem um orgão emissor ou mesmo que não tenha sido informados? Simples, cria-se um registro pai com a denominação "SEM ÓRGÃO INFORMADO" e antes de colocar as regras, deve-se fazer um select para que todos os registros que tenham NULL no relacionamento documento <-> órgão emissor seja colocado tal informação. Na aplicação essa opção também pode aparecer no "DROP DOWN" e assim atende-se a todas as regras. Por fim, um comentário acerca da ANÁLISE. Ela serve como dicionário de dados, mas não serve como garantia de INTEGRIDADE RELACIONAL, mesmo para o HFSQL se você quiser aplicar tal regra tem de executar um comando a parte para depois manipular o registro em si. O que na ANÁLISE eu faço é muitas vezes apontar um relacionamento falso, para que a linguagem me facilite o trabalho de alguns componentes em tempo de projeto (podendo até mesmo permanecer para o tempo de execução) pois como falei, se não for explicitamente chamada a verificação de integridade o WD nada fará com essas regras. Abraços
  21. 1 like
    @Rinaldo Xavier vc é bão demais ,menino !
  22. 1 like
    Função para retornar quantidade de meses entre duas datas. Contribuição do nosso colega Rinaldo PROCEDURE NumeroMeses(LOCAL dParametroDataInicial, LOCAL dParametroDataFinal) dDataInicial is Date = dParametroDataInicial dDataFinal is Date = dParametroDataFinal nContador is int = 0 WHILE dDataInicial <> "" AND dDataInicial < dDataFinal dDataInicial..Month++ nContador += iif(dDataInicial <= dDataFinal, 1, 0) END RESULT nContador
  23. 1 like
    Com a dica do Gustavo Nome_da_tab[Número Tab].Visible = False
  24. 1 like
    VAL() = Mesmo em Windev Ex: Val("143") // Returns 143 Val("1.67") // Returns 1.67 Site: https://help.windev.com/?3024037&lang=en-US&productversion=xxA250083n STR() e STRZERO() use NumToString Ex: NumToString(123) // Returns "123" NumToString(1.23) // Returns "1.23" NumToString(1,"03,0f") // Return 001 Site: https://help.windev.com/?3024024&lang=en-US&productversion=xxA250083n SUBSTR() use Middle // Extract characters Middle("Eponine", 2, 3) // Returns "pon" Middle("Eponine", 2) // Returns "ponine" Site: https://help.windev.com/en-US/?3024023&name=Middle CTOD() e DTOC() use StringToDate StringToDate("01-02-2020", "DD/MM/YYYY") // Returns na tela = "01/02/2020" no padrão no banco de dados fica 20200201 StringToDate("25/12/2001") // Returns = "20011225" Site: https://help.windev.com/?3027013&lang=en-US&productversion=xxA250083n ALLTRIM(), LTRIM (), RTRIM (), TRIM () use NoCharacter sTexto is string = " estou mostrando como ficaria " NoCharacter(sTexto," ", sscAll) = "estoumostrandocomoficaria" NoCharacter(sTexto," ", sscRight) = " estou mostrando como ficaria" NoCharacter(sTexto," ", sscLeft) = "estou mostrando como ficaria " NoCharacter(sTexto," ", sscInside) = " estoumostrandocomoficaria " NoCharacter(sTexto," ", sscOutside) = "estou mostrando como ficaria" Site: https://help.windev.com/?1000019391&lang=en-US&productversion=xxA250083n Caso os colegas precisem de mais só ir me passando que vou tentando ajudar.
  25. 1 like
    @Ananias Guerra veja se com essa opção resolve sua questão.. veja a imagem.. Description do projeto > Advanced > ...
  26. 1 like
    Olá, DEV! Tudo bem? Vou dar mais uma dica interessante pra você.. Caso você queira oferecer um recurso de rota no mapa na sua aplicação do WINDEV sem a necessidade do uso da chave API do Google Maps. Eu fiz um vídeo demonstrando, veja! https://fabriciodicaswx.blogspot.com/2020/05/abrindo-uma-rota-no-navegador-google.html
  27. 1 like
    Tem no "Dicas e Truques" do Pedroso (aki nesse link) Tem tb no Windev ao fazer uma nova window escolhendo RAD e depois modelo MVP, com isso irá pedir a tabela ou tabelas para criar o form e já serão criadas as classes OOP para manipular as mesmas. E aki nesse link tb tem um vídeo em espanho falando algo a respeito a partir do minuto 7:00 mais especificamente. Agora seja algo fora desses exemplos q abordei, poderia fornecer mais detalhes do q precisa?
  28. 1 like
    Vlw @Mello Junior é uma boa ideia pensando-se em controle de limite de usuários q podem utilizar o sistema, obrigado por compartilhar.
  29. 1 like
    Boa dia a todos. Não sei se estou falando bobagem, por isso estou postando esta observação: É sobre o LOOPER no Windev24. Ele não obedece Draw Empty Row e InsideBorder e OutSideBorder dá no mesmo, só dá OutSideBorder. Notei isso porque no Windev22 tenho um looper que funciona certinho, mas quando converti para Windev24, não veio conforme projetado. Depois criei um looper para teste no Windev 24 e observei isso que acabei de relatar. Ou é um bug ou não estou sabendo configurar corretamente um looper, Se alguém puder certificar isso agradeço. No meu projeto, o looper foi feito para aparecer as linhas que não são preenchidas, mas no Windev24 só aparecem as linhas preenchidas e a opção de aparecer as linhas não funcionou. Os mais experiêntes talvez saibam como resolver isso por programação. Eu não achei como. Obrigado.
  30. 1 like
    Pensei tb em algo nesse sentido, criar um token q seria oriundo de um hash de alguns dados cadastrais do cliente, ai amanhã ou depois preciso bloquear bloqueio o token, tipo uma flag, habilitado ou não. E ao salvar o token no banco onde terá os dados do cliente q compuseram o token / hash, uma informação amarra a outra, ou seja, não tem como mudar alguma informação q compôs o token/hash sem afetar o mesmo e necessitar de uma nova validação do token. Acredito q assim vai resolver. Vlw galera!!! Vlw @José Willem
  31. 1 like
    Rest do Windev , ai montava uma lista de token de acesso.
  32. 1 like
    Como posso apagar as mensagens de notificação que fica no banco de dados, quando a gente abre o Control Center. Preciso limpar, pois por falta de conhecimento, deixei uma arquivo zipado na pasta do banco, e isso gerou muitos avisos de erro, que só agora descobri e resolvi. Agradeço a quem possa ajudar
  33. 1 like
    Vlw Cassiano, com o comando abaixo está quebrando o calho num primeiro momento. SysIconDisplayTooltip("MEU TEXTO","TITULO", sysTooltipTypeInfo)
  34. 1 like
    serial 4 bytes autoincrementing integer 1 to 2147483647 bigserial 8 bytes large autoincrementing integer 1 to 9223372036854775807 Pensando-se em volume de dados e evitar conflitos, o BIGSERIAL fornece mais possibilidades, porém ocupará mais espaço no banco, cada um precisará avaliar bem seu contexto se usará SERIAL, BIGSERIAL ou UUID (q tb é uma outra possibilidade para evitar conflitos, mas não é sequencial) Até o momento foi as informações q consegui levantar, se alguém quiser complementar ou corrigir algo q talvez tenha falado equivocadamente, por favor, fique a vontade.
  35. 1 like
    @pvsousa, eu faço e gerencio todos os relacionamentos direito no Postgresql eu não uso as opções de relacionamento da Analise, hoje eu tenho 2 aplicativos acessando a mesma base de dados, uma feito em Cobol e outro em Windev, então não tenho problemas. Evandro Andersen HDTec Software
  36. 1 like
    Veja se com essa importação se vc não vai perder os relacionamentos, em versões anteriores isso ocorria
  37. 1 like
    Isso mesmo Cassiano, uso a opção "Update the Analysis from the external databases" Evandro Andersen
  38. 1 like
    Pode e deve usar NULL Cassiano Então ai vem a dúvida, alguém pode explicar esse negócio de NULL, NOT NULL e DEFAULT? Default Null = se o campo não for informado no comando insert, ele receberá o valor NULL automaticamente Not Null = você será obrigado a informar algum valor ao campo, ele não irá aceitar NULL Default = você pode informar um valor para quando a coluna não for informada no comando sql, por exemplo, na tabela pedidos, você tem um campo pedi_datahora, você pode colocar ele como NOT NULL e DEFAULT com o valor Now(), assim caso você não informe a coluna no insert, automaticamente o banco irá preencher a coluna com a data/hora atuais. Evandro Andersen HDTec Software
  39. 1 like
    Olha Cassiano, eu não desligo a chave estrangeira nunca, vamos a um exemplo prático: digamos que você tenha uma tabela de pedidos, onde nessa tabela tenha uma coluna pedi_cliente que é uma coluna obrigatória, pois todo pedido é obrigado a ter um cliente vinculado, não adianta você desligar a Foreign Key, porque depois de importar os dados, quando você recria-lá, o banco irá "reclamar" mas se for uma situação, onde por exemplo o cliente ainda não esta criado, mas será criado até o final da transação, basta você marcar a foreign key como Deferrable, marcando essa opção, o postgresql só vai validar o relacionamento no final da transação Evandro Andersen HDTec Software
  40. 1 like
    Toda a parte de relacionamento entre as tabelas eu gerencio direto no Postgresql não levo nenhuma informação para a Análise do Windev Como seria um exemplo prático de CASCADE x RESTRICT x NO ACTION x DEFAULT R= exemplo de cacade: você tem uma tabela de pedidos e pedidos_itens, ao deletar um registro da tabela pedido, todos os registros da tabela pedidos_itens também serão excluídos R= exemplo de restrict: se você tentar deletar um registro da tabela pedidos que ainda tenha registros vinculados na tabela pedidos_itens, o banco de dados não irá permitir o delete R=exemplo de NO ACTION: você deleta um registro na tabela pedidos e o banco não valida se tem registro na tabela pedidos_itens R=exemplo de DEFAULT: digamos que você tenha uma tabela de clientes, e exista um campo clie_vendedor que esta relacionado a tabela vendedores, se você excluir um registro na tabela vendedores, e o DEFALT do relacionamento for NULL, e este tiver algum cliente vinculado a ele, o banco irá atualizar o campo clie_vendedor de todos os clientes vinculados para NULL Se não adianta mesmo mexer isso na análise pq não atualiza o banco, tendo q fazer tudo no banco somente. R= como eu disse, eu faço tudo no banco e depois atualizo a Analise Em caso de se utilizar CASCADE e RESTRICT como fica no dia a dia para remover algum registro em caso de restrição? R=usando o mesmo exemplo das tabelas pedidos e pedidos_itens, digamos que vc deixou marcado como restrict, para deletar um pedido, você será obrigado a antes deletar os registros da tabela pedidos_itens e depois estará liberado para deletar o registro da tabela pedidos Evandro Andersen HDTec Software
  41. 1 like
    Eu sempre usei NULL e até agora não tive problemas Evandro Andersen HDTec Software
  42. 1 like
    Vou te falar como eu faço Cassiano, digamos que eu queira criar um campo novo em uma tabela já existente: ao invés de alterar a Analyse e ela fazer a alteração no banco, eu faço o contrário, eu altero a tabela no banco e depois abro a analyse e mando atualizar a analyse com base no banco de dados, e para replicar essa alteração da base nos clientes, eu gero um arquivo .SQL com as alterações que foram feitas você pode montar esse SQL de atualização manualmente, mas eu uso um software chamado Database Comparer da empresa EMS, ele compara 2 bases de dados e gera um script SQL de atualização, funciona 100% Evandro Andersen HDTec Software
  43. 1 like
    somente hfsql possui esse recurso, inclusive com agendamento no caso do post vc vai fazer uma chamada ao pg_dump passando paramêtros
  44. 1 like
    funcionam normalmente, eu ia te responder sobre a integridade mas já está em sua pergunta
  45. 1 like
    se as funções forem compatíveis com o padrão do HFSQL funcionam sem problema outra opção para executar funções não compatíveis é executando a query da seguinte maneira HExecuteQuery(QRY_itens_sem_rateio,Conexaopostgres,hQueryWithoutCorrection) com esse recurso vc executa funções que não são nativas do HFSQL
  46. 1 like
    vc tem as 2 funções independente do banco utilizado, o que vc não vai ter é o hmodifystructure
  47. 1 like
    As mudanças dentro do projeto tem o mesmo comportamento independente de ser HFSQL ou POST, ele atualiza os componentes As maiores diferenças existentes são: O QUE FUNCIONA NO HFSQL E NÃO FUNCIONA NO POST lock registro atualização estrutura é automática triggers da analise posso ter esquecido de mencionar algum outro ponto chave, mas o principal é isso ai
  48. 1 like
    Segue dica extraída a partir do link "O q tenho feito para minha demanda/necessidades é adicionar 2 opções no menu que são: "Exportar Banco de Dados" e "Importar Bacno de Dados". Segue código: // Exportar Dados // COMPILE IF Configuration <> "iOS application" IF YesNo("Deseja exportar o banco de dados?") = Yes THEN sSource is string = fDataDir() + "/*.*" sDestination is string = SysDirExternalStorage(1, ssePublicDownload) Info(sSource +" para "+ sDestination) IF fCopyFile(sSource,sDestination,frConfirm) = False THEN Error(ErrorInfo()) ELSE Info("Copiado com sucesso!") END END // Para Importar // COMPILE IF Configuration <> "iOS application" IF YesNo("Deseja importar o backup do banco de dados salvo no aparelho (pasta downloads) ?") = Yes THEN sSource is string = SysDirExternalStorage(1, ssePublicDownload) + "/bplog.fic" sDestination is string = fDataDir() IF fFileExist(sSource) = True THEN IF fCopyFile(sSource,sDestination,frConfirm) = False THEN Error(ErrorInfo()) ELSE Info("bplog.fic restaurado com sucesso") END sSource = SysDirExternalStorage(1, ssePublicDownload) + "/bplog.ndx" IF fCopyFile(sSource,sDestination,frConfirm) = False THEN Error(ErrorInfo()) ELSE Info("bplog.ndx restaurado com sucesso") END ELSE Info("Arquivos não encontrados. Verifique se estão armazenados corretamente na pasta.") END END Ai seria fazer os ajustes conforme sua demanda. Autor: Geoff
  49. 1 like
    Bom dia, Em um formulário preciso atribuir o mesmo atalho (F2) como atalho para diferentes botões. Exemplo: - Estando no EDT do codigo do cliente, F2 servir como atalho para o botão PROCURA CLIENTE - Estando no EDT do codigo do vendedor, F2 servir como atalho para o botão PROCURA VENDEDOR Tem como?
  50. 1 like
    Faz o seguinte, nos lugares q chamam as outras janelas captura o retorno delas, tipo assim: (EDT_Retorno_1, EDT_Retorno_2, EDT_Retorno_3, EDT_Retorno_4) = Open(WIN_TesteWindowRetornaVariosRetornos) E na janela q devolve vc passa os valores a serem retornados, tipo assim: Close(MyWindow,EDT_1,EDT_2,EDT_3,EDT_4)