Leaderboard


Popular Content

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

  1. 6 likes
    Boa tarde, segue em anexo: Vídeo introdutório sobre a demonstração a título de compartilhar conhecimento da integração via HTTP Request métodos POST e GET com a API WTS Api para integração com o Whatsapp. Vídeo explicativo do funcionamento da API Backup do Projeto Link para Manual da API Sobre a API podem falar diretamente com o Hendell criador da mesma. Contato do Sr. Hendell 62 9 8165-9440 Salientamos q nosso objetivo aki é compartilhar e promover conhecimento. A questão da API, comercialização etc é diretamente com Sr. Hendell da WTS Informática. O fórum WxDev ou seus moderadores não tem qualquer vínculo ou responsabilidade. Em anexo, vídeos demonstrativos e projeto utilizado. Lembrando q para q o projeto funcione é necessário ter um ENDPoint e Token q é conseguido solicitando diretamente para o criador da API no contato acima descrito. Vídeo 1 - Introdução Vídeo 2 - Demonstração Backup Projeto na versão Windev 22 *Atenção* Precisa da URL do EndPoit e do Token da API q tem q ser vistos direto com o pessoal da API
  2. 4 likes
    Pessoal funcionou aqui 100%, meu problema que no primeiro WHILE estava insistindo em usar SQLFetch("aSQL") = 0, só depois no segundo que estava fazendo conforme a dica do nathanreys , a partir de agora somente irei usar o WHILE SQL.Out = False não terei mais problema nesse sentido, pq usando SQLFetch("aSQL") ele realmente zera o conteúdo. Obg a todos pelo ajuda.
  3. 4 likes
    Você pode usar DECODE, select decode(valor, 1, 'monta com amarelo', 2, 'monta com azul', 'monta com vermelho' from tabela repara que o que o resultado pode ser varias coisas, até mesmo um outro select Não sei se é isso que precisa. Abc Saul
  4. 3 likes
    Atualmente o controle de mapas no Windev tem 2 tipos de visualização Satélite e Normal, não possuindo o modo STREETVIEW. Para tanto se faz necessário executar um código HTML, até aki tudo bem pq o Windev Mobile possui o controle HTML q pode ser inserido no aplicativo, porém se este controle possui JAVASCRIPT precisa q marque um checkbox no description do controle para permitir seu funcionamento. Compartilhando solução do amigo @tsilva q gentilmente cedeu aki pra comunidade. Segue comentários e código do @tsilva // Nesse caso que eu estou usando, estou consumindo um webservice a cada 10 segundos com uma procedure e atualizando o resultado na tela Esse código aki q precisou habilitar o Checkbox do print acima no controle HTML // Procedure que consome o webservice PROCEDURE GetPositions() //criando variaveis necesarias para o controle mapa //-----------------------//---------------------- MyMarker is Marker MyPosition is geoPosition oRequest is httpRequest oResponse is httpResponse vVariantjson is Variant // comeca o consumo do webservice //------------------//------------------------------------ oRequest..URL = gsSlink+"/api/positions" oRequest..User = sEmail oRequest..Password = sPass oRequest..Method = httpGet oRequest..ContentType = "application/json" oResponse = RESTSend(oRequest) // Declarando uma variavel string para receber o valor da string inicial e as posicoes Lat+Long sGsmaphtml is string // verifico o recebimento do webservice si esta ok IF oResponse.StatusCode = "200" THEN // transformo o json recebido em uma variant para trabalhar com o resultado vVariantjson = JSONToVariant(oResponse.Content) //apago todos os markers do mapa MapDeleteAll(MAP_SinNombre1) // aqui vou fazer um for na variante para tratar o resultado FOR ALL srVarVariante OF vVariantjson // como e um for para atualizar em tempo real,o street view limpo as variaveis strings gsStreetlat = "" gsStreetLon = "" sGsmaphtml = "" //verifico se valores e de um carro que quero bloquear IF srVarVariante.deviceId = gnCarroBloqueo THEN // comeco a pegar os valores do webservice e guardar en variaveis locais MyPosition..Latitude = srVarVariante.latitude MyPosition..Longitude = srVarVariante.longitude //essas dias variavels sao que vou usar no street view gsStreetlat = srVarVariante.latitude gsStreetLon = srVarVariante.longitude // monto a string para o controle html sGsmaphtml = StringBuild(gsStreetView,gsStreetlat,gsStreetLon) // daqui para baixo sao coisas simples e comuns para trabalhar com mapas markerimg is Image = "marker_bus_online.png" markerimg..Height = 16 markerimg..Width = 16 Velocidade is real = srVarVariante.speed * 1.852 ProgBarLCD = Velocidade ProgBarLCD..Caption = "Velocidad2" ProgBarLCD..Visible = True MyMarker..Image = "carro2.png" MyMarker..Position = MyPosition MyMarker..Name = WIN_Devices..Title // MyMarker..Description = sNamedevice WIN_Devices..Title = Velocidade+" Km/h "+gsNombreVeiculo MapAddMarker(MAP_SinNombre1, MyMarker) MAP_SinNombre1.DisplayPosition(MyPosition) MAP_SinNombre1..Zoom = gnMapZoom //aqui passo a string para o controle mapa HTM_StreetView = sGsmaphtml END END END Veja o resultado, atualizando de 10 em 10s em tempo real https://www.dropbox.com/s/xq4h5z0iq3zo4yo/IMG_8681.MOV?dl=0 Abaixo novamente o Checkbox q precisa marcar para funcionar o JAVASCRIPT.
  5. 3 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
  6. 3 likes
    Obrigado Cassiano por compartilhar, grande contribuição
  7. 3 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
  8. 3 likes
    Acabamos conseguindo resolver excluindo a configuração do WS e criando de novo
  9. 3 likes
    Olá, Se quiser trabalhar em uma coisa mais lógica, trabalhe direto na grandeza, por exemplo, se eu quiser somar 90 horas em um datatime: dtFinalDateTime is DateTime = SysDateTime() dtFinalDateTime..Hour += 24 Se quiser trabalhar com minutos, então: dtFinalDateTime is DateTime = SysDateTime() dtFinalDateTime..Minute += 190 //somando 190 minutos para o datatime de forma similar para variáveis do tipo time: tFinalDateTime is Time = Now() tFinalDateTime..Minute += 190 Abs
  10. 3 likes
    Uma das novidades da versão 25, a função PicResize permite redimensionar uma imagem no formato WDPic. Todas as camadas da imagem são redimensionadas. Para redimensionar apenas uma camada da imagem, existe a função dResize. Exemplo: // Abrindo a imagem de origem MInhaImagem is a WDPic MInhaImagem..FileName = fExeDir() + ["\"] + "logo.png" // Dimensionando a imagem PicResize(MInhaImagem, 100, 100, drHomothetic) // Gravando o resultado PicSave(MInhaImagem, fExeDir() + ["\"] + "novologo.png") Quanta novidade em um pedacinho de código!
  11. 3 likes
    Bom dia, Encontrei o video abaixo do Amarildo de como ler arquivo xml de uma Nfe, que pra mim foi o melhor que ja vi sobre esse tema. Mamao com açúcar (depois da explicação heheh)
  12. 2 likes
    Utilizando o comando exeInfo com o argumento exeversion. QUando em modo teste irá trazer a versão do WD que estiver rodando mas rodando no dispositivo trará a informação adequada.
  13. 2 likes
    Boa tarde, Para bobinas usar apenas os blocos: - Start Of Document - Body - End Of Document Em "description" do report, na guia "Blocks", em "End of Document" marcar "BEFORE THE PAGE FOOTER BLOCK"
  14. 2 likes
    Olá Pessoal. Estou apresentando à Comunidade o nosso Curso de Windev Mobile versão 25. Procurei colocar links ao invés de arquivos para não poluir o ambiente do forum Então, segue o link do pdf com o conteúdo do curso. https://www.dropbox.com/s/sdywvf91cyjw34o/wm_25_modulo1.pdf?dl=0 Este curso tem um custo de R$ 300,00, preço de lançamento e você recebe de uma vez só as 30 aulas e os fontes. Você pode pagar por depósito bancário à vista R$ 300,00 À vista pelo Paypal (com seu cartão de crédito), R$ 325,00 Em 3 vezes pelo Paypal (com seu cartão ou boleto) R$ 360,00 Segue o link de um vídeo demonstrativo: https://www.dropbox.com/s/od5t1cx1ktf1cl8/demo_curs9_mod1.mp4?dl=0 Qualquer informação adicional, por favor envie um email para [email protected]
  15. 2 likes
    ///linha de código da impressão iEndPrinting() // AposIF iDocumentPrinted() = True THEN // Registra se foi o não impresso... Info("Impresso") else Info("Nãoooo Impresso")END
  16. 2 likes
    Pq vc não cria um segundo campo pra saber o tipo de arquivo e ai na hora de abrir vc lê esse campo antes e carrega conforme. Exemplo campo TipoArquivo Int onde 1.PDF 2.Imagem (JPG, PNG, BMP, GIF, etc) 3.Doc 4.Excel 5.TXT 6... 7... ... Ai vc trata primeiro o tipo do arquivo e depois carrega no controle apropriado pré definido SWITCH Midia.TipoArquivo CASE 1 // PDF oControlePDF = Midia.Arquivo oControlePDF.Visible = True CASE 2 // Imagem oControleImagem = Midia.Arquivo oControleImagem.Visible = True ... END
  17. 2 likes
    O erro de carregamento da fonte pode ser reparado colocando o CDN de acesso: no HTML: <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/elusive-icons/2.0.0/css/elusive-icons.min.css"> na Página Webdev: https://maxcdn.bootstrapcdn.com/elusive-icons/2.0.0/css/elusive-icons.min.css
  18. 2 likes
    somente com essas informações é impossível te ajudar é fundamental analisar o projeto como um todo nesses casos, especificamente esse formulário aqui temos sistema WEB rodando e não temos esse problema citado coloque aqui imagens do form em questão e se tiver planes idem
  19. 2 likes
    Nunca usei esse groupware. Desenvolvi uma tabela 'grupos' e outra 'grupos_permissoes' a qual contém campos, por exemplo :'nome_tabela', 'incluir', 'excluir', 'editar', etc... O cliente pode criar seus próprios grupos e marcar as permissões e atribuir os usuários a um desses grupos. Pode ser uma idéia...
  20. 2 likes
    Não, pois no Fechamento da Window, você força a atualização do Registro. A sutil diferença está na identificação do autor da operação, logo todos tomarão muito mais cuidado com essa rotina.
  21. 2 likes
    Pessoal, tenho um web service funcionando há bastante tempo, porém fiz uma alteração e não estou conseguindo publicar. Não foi alterado nada nas configurações. Se clico no botão para testar a conexão diz que está ok. Alguém sabe o que pode ser? Obrigado Rinaldo
  22. 2 likes
    Da uma olhada na função SQLLock() Parece q é o q vc precisa. Segue link do manual
  23. 2 likes
    Respondendo minha própria pergunta de como recuperar o usuário e senha informados na chamada a um webservice rest no Windev exemplo de chamada do lado client: ====================================== oRequest is httpRequest oResponse is httpResponse oRequest..URL = "http://localhost/vendedores/100" oRequest..Method = httpGet oRequest..User = "evandro" oRequest..Password = "123" oResponse = HTTPSend(oRequest) exemplo de código lado server: ====================================== sCampo is string = WebserviceReadHTTPHeader("Authorization") //o conteúdo de sCampo será: "Basic ZXZhbmRybzoxMjM=" //o usuario e senha vem codificado em base64 sCampo = Decode(ExtractString(sCampo, 2, "Basic "),encodeBASE64) //fiz um decode do conteúdo depois da palavra Basic //agora o sCampo vale: "evandro:123" //agora basta extrair o usuário e senha e fazer as validações necessárias sUser is string = ExtractString(sCampo, 1, ":") sPassword is string = ExtractString(sCampo, 2, ":") Agradecimento especial ao @Fábio Senji que tentou ajudar! Att, Evandro Andersen HDTec Software
  24. 2 likes
  25. 2 likes
    O projeto ACBr é um projeto open source q existe a mais de 10 anos integrando diversas facilidades, uma delas é o envio de emails. Os componentes do projeto ACBr são nativos para linguagem pascal, no entanto, podem ser utilizados por outras linguagens por meio de um monitor (EXE q monitora determinada pasta e faz troca de arquivos para interação das funcionalidades) e agora via Dll. O objetivo deste tópico é fornecer um exemplo de código / passo a passo para utilizar a Dll no envio de e-mails Segue: // Manual Online do ACBrLib // https://acbr.sourceforge.io/ACBrLib/MAIL_Inicializar.html // Pré requisitos: // Dlls: // ACBrMail32.dll q deve estar na pasta EXE do projeto // Demais dlls dependencias q são: // libssl-1_1.dll // libcrypto-1_1.dll DLLRetorno is int = 0 // Caso não exista será criado o arquivo ACBrEmail.INI no path informado DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_Inicializar",fCurrentDir()+"\ACBrEmail.INI", "") // Segundo parametro conforme manual é a chave de criptografia, se deixar em branco fica o padrão DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","Nome", "Sua Empresa") DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","Conta", "[email protected]") DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","Usuario", "[email protected]") DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","Senha", "senhadoemail") DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","Servidor", "smtp.googlemail.com") // se for google, se não tem q ver as configurações dos outros DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","Porta", "465") // exemplo se for hotmail, yahoo, etc, pode ser q varie a porta, SSL, TLS etc DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","SSL", "1") // vide configuração do provedor de email e tb como configurar no manual* DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_ConfigGravarValor","Email","TLS", "0") DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_Clear") DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_SetSubject", "Email Teste" ) DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_AddAddress","[email protected]", "Nome do destinatário" ) DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_AddAltBody", "Corpo do email teste" ) DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_Send", True) // manda via thread, em background DLLRetorno = CallDLL32("ACBrMail32.dll","MAIL_Finalizar") Info(DLLRetorno) // lista de retornos no manual
  26. 2 likes
    Bom dia, https://doc.windev.com/en-US/?1514069&name=duration_type_variable
  27. 2 likes
    Olá, DEV's! Vou dar uma super dica pra quem deseja hospedar aplicações web desenvolvida no WEBDEV. Você criou seu projeto web, banco de dados, páginas, formulários de cadastro e agora quer ver na prática o funcionamento desse sistema certo? Caso não saiba a PCSOFT disponibiliza gratuitamente um serviço de hospedagem para testes, isso mesmo! Vou mostrar como você pode realizar o processo para adquirir e começar a testar seus sistemas web! Veja o passo a passo: https://fabriciodicaswx.blogspot.com/2019/12/hospedagem-web-gratis-pcsoft.html
  28. 2 likes
    Para pegar de um Data Source e jogar direto para dentro de uma array, tem de lembrar de definir a array com a mesma estrutura de colunas e então utiliza o comando: FileToArray(arrContact, CONTACTS) onde arrContact seria a Array e CONTACTS o Data Source.
  29. 2 likes
    Jackson em windev se comporta da mesma forma. arrprodutos is array of 1 by 4 ArrayAddLine(arrprodutos, space(6), 0 , "", ctod("") ) Obs: agora se vc não souber o numero de colunas na hora de declarar ela, vc utiliza depois o Dimension(arrprodutos, i, 10) Abs
  30. 1 like
    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
  31. 1 like
    Olá, Para as compilações do DESKTOP pegamos a versão diretamente escrita no executável e para o mobile, como e onde pegar a versão que escrevemos quando geramos o APK? Muito obrigado
  32. 1 like
    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
  33. 1 like
    Acho que dá para saber o foco assim: IF {_EVE.name, indControl}..Name = "EDT_xxx" THEN
  34. 1 like
    sim, a VINDI é uma empresa nacional, é um gateway de pagamento digamo assim https://vindi.com.br/
  35. 1 like
    PROCEDURE Iif(Condicao is boolean, Resultado_True, Resultado_False) IF Condicao THEN RESULT Resultado_True ELSE RESULT Resultado_False END
  36. 1 like
    Rogério, Então aproveite a mesma ideia do HARBOUR e ao invés de pensar em uma procedure de cada vez, declare uma classe onde seus atributos automaticamente serão globais para todos os métodos que compuserem a CLASSE. Att
  37. 1 like
    Pois então pensei nisso tbm... Mas como vc disse, é arriscado temos 16 usuários ao mesmo tempo.... mas vou usar uma alternativa de montar uma janela de impressão e ali faço como desejo... mas valeu... OBG!!
  38. 1 like
    Ananias, por essa ultima imagem parece que a renderização esta carregada mesmo, outro detalhes a observação do Hugo é muito importante e em muitos casos provoca lentidão, outra observação, o google chrome costuma ficar lento por conta de algumas extensões
  39. 1 like
    Fiz uma experiência aqui, clicando no botão que mostra o Popup (apenas chama o Popup e não executa mais nada) e retirando todos os códigos do Popup. Então eu clico para exibir o Popup, clico para fechar o Popup. Mesmo sem processar nada mais que isto, o sistema vai ficando cada vez mais lento. No Browser vi esses logs de alerta:
  40. 1 like
    Pessoal, bom dia. Trabalhando com Windev e Postgresql gostaria de saber se alguém tem algum norte a respeito de concorrência de registros. No caso vamos supor que eu esteja alterando uma VENDA, e gostaria que nenhuma outra pessoa pudesse entrar ao mesmo tempo que eu pra mexer nessa venda, como proceder, e o que vcs me indicam a estudar e me aprofundar p aprender a prosseguir da maneira correta? Grato!
  41. 1 like
    Tudo resolvido e funcionando. Utilizei o SQLLock(codigo_sql) para efetuar o bloqueio do registro. Porém o pulo do gato foi no SQL passado para a função. Coloquei no final da instrução as seguintes sentenças: "FOR UPDATE NOWAIT". O NOWAIT faz com que caso não seja possível efetuar o bloqueio ( sinal que tem alguém já bloqueando o registro ) o sistema não trave e não espere até o registro ser liberado, sendo assim você consegue retornar uma mensagem de erro personalizada para o usuário.
  42. 1 like
    EU normalmente trato essas tabelas elaborando um HOPEN e capturando um ErrorOccurred(), daí é uma questão de tratar o erro e mandar ver. Fazer de conta que o erro não existe, não é uma boa ideia, contudo você pode trabalhar comandos DDL para tratar e corrigir a tabela em questão. []´s
  43. 1 like
    Tente usar HTransaction, dá um nível de isolamento melhor, o LOCK ainda não vi funcionar com o PostgreSQL, muito embora em caso de registro concorrente existe alguns subterfúgios, como por exemplo marcar o registro com um determinado número logo que lê e carrega o Form, assim sendo quando for abrir tem de verificar se o determinado campo está zerado se não estiver é sinal de que algum outro terminal já está atuando sobre o registro. Importantíssimo é garantir que zera o arquivo assim que concluir o processo. Att
  44. 1 like
    Segue abaixo exemplo de código de como poderia ser feito. sTexto is ANSI string = fLoadText("c:\local\nomedoarquivoINI") // Carrego o conteudo do arquivo INI na variavel sTexto arrSplitGeral is array of strings = StringSplit(sTexto,CR) // separo as linhas criando um Array com elas nPos is int FOR EACH sLinha OF arrSplitGeral // varro esse array analisando cada linha // Trace(sLinha) // se quiser mostrar na tela sLinha = NoSpace(sLinha) IF Left(sLinha,1) = "[" THEN // se primeiro caracter for "[" entendo q é uma Sessão, no teu caso [MEDICAMENTOS] sSessao is string = NoCharacter(sLinha,"[]") // tiro os colchetes // ListAdd(LIST_Cleiton, sSessao) // no meu caso eu jogo em um ListBox as sessões // Armazeno num array criado previamente nPos = Add(arrINI) // add uma nova sessao arrINI[nPos].sSessao = sSessao ELSE // se não é sessão mas o nPos maior q zero, sinal q previamente foi add uma sessão ai eu pego o conteudo dela IF nPos>0 THEN sChave is string = ExtractString(sLinha,1,"=") sValue is string = ExtractString(sLinha,2,"=") IF sChave <> "" // armazeno elas em um array nPosChave is int = Add(arrINI[nPos].arrChaves) arrINI[nPos].arrChaves[nPosChave].sChave = sChave arrINI[nPos].arrChaves[nPosChave].sValue = sValue END END END END Caso queira criar o array baseado em estruturas como fiz segue a declaração das variáveis q coloquei no Code inicial do projeto. // Estrutura pra guardar as chaves e valores dentro das sessões st_Chaves is Structure sChave is string sValue is string END // Estrutura para guardar as sessões e as chaves+valores de cada sessão st_INI is Structure sSessao is string arrChaves is array of st_Chaves END arrINI is array of st_INI // variavel global baseada na estrutura
  45. 1 like
    Olá, gostaria de saber como recuperar o usuário e senha de autenticação em um webservice Rest na imagem abaixo eu informei o usuário e senha, mas dentro do webservice não encontrei como recuperar essa informação para fazer a validação Att, Evandro Andersen
  46. 1 like
    Muito interessante, obrigado por compartilhar!!
  47. 1 like
    Caio.. tenho uma dica.. possa ser que resolva sua questão.. quando você cria a combo box.. existe a opção que você invoca uma window "janela" para listar os registros usando uma table mesmo.. dai na table você faz esse recurso da paginação.. ai resolve a parada.. é simples.. mas resolve.. Ok.. espero que tenha entendido..
  48. 1 like
    Boa tarde @Fábio Senji, eu quero validar se a pessoa que esta acessando o webservice tem direito ou não de acessá-lo, no tipo de autenticação "BASIC" você informa apenas usuário e senha, eu gostaria de tratar essa informações no webservice, mas não sei como recuperá-las
  49. 1 like
    Olá, DEV! Tudo bem? Hoje vou lhe apresentar uma das novidades do WEBDEV 25!Caso não saiba, agora é possível criar e manipular dados JSON na camada browser. https://fabriciodicaswx.blogspot.com/2019/12/json-na-camada-browser-webdev-25.html
  50. 1 like
    O Jackson começou com uma sopinha caldo de bila Depois colocou umas verdurinhas pra ficar mais grossa Depois chutou o balde e colocou mocotó de boi dentro e tutano kkkkkkkk Essa precisamos ir pra prancheta pra estudar. Imagino q pegando a idéia do admin (criando uma array of Variant) e junto com a função HDeclareExternal() seja possível fazer isso. Mas precisamos testar hehehe Vamos aguardar e ver se alguem tem uma solução pra esse caso, até a gente testar