Ir para conteúdo
Fórum Script Brasil

robinhocne

Membros
  • Total de itens

    854
  • Registro em

  • Última visita

Tudo que robinhocne postou

  1. Bom dia, Jhonas, mas pelo windows etá imprimindo normalmente e já tinha removido e instalado novamente, mas mesmo assim continua.
  2. Bom dia, Estou tendo esse erro ao imprimir em rede em uma impressora matricial lx 300 para geral o relatório eu uso o fortes report.
  3. valeu Jhonas, consegui, me ajudou muito sua explicação e esse artigo também; implementation {$R *.dfm} uses Registry; procedure TForm1.Button1Click(Sender: TObject); var reg, subReg: TRegistry; chaves, chaves1: TStringList; i:integer; caminho : String; begin caminho := '\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\'; Reg := TRegistry.Create; Reg.Access := KEY_READ; Reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey(caminho,false); chaves := TStringList.Create; reg.GetKeyNames(chaves); subReg := TRegistry.Create; subReg.Access := KEY_READ; subReg.RootKey := HKEY_LOCAL_MACHINE; chaves1 := TStringList.Create; for i :=0 to chaves.Count -1 do begin subreg.OpenKey(caminho+chaves[i],false); subReg.GetKeyNames(chaves1); //ShowMessage('\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\'+chaves[i]+'\Connection'); if (copy(chaves[i],0,1) = '{') then begin // ShowMessage(chaves1.strings[0]); reg.OpenKey(caminho+chaves[i]+'\'+chaves1.strings[0],false); //reg.GetKeyNames(chaves1); ShowMessage(reg.ReadString('PnPInstanceId')); if (reg.ReadString('PnPInstanceId') <> '') then cbAdaptador.Items.Add(reg.ReadString('Name')); end; end; reg.CloseKey(); reg.free; chaves.free; subReg.CloseKey(); subReg.free; chaves1.free; end; end.
  4. Bom dia, há uns dias estava com um problema onde necessitava alterar o IP do pc, consegui porém essa façanha necessita passar o nome do adaptador de rede, infelizmente para cada sistema operacional isso muda e hoje descobri que piora mais ainda quando uma placa de rede queima, quando temos wifi, maquina virtual e etc, então uma solução que estou procurando para capturar o nome desse adaptador é vasculhando os registros do windows, acho que encontrei o caminho certo, porém como nem tudo é simples.... a lista de adaptadores aparece dessa forma nos registros do windows o Caminho dos registros é : Computador\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318} Porém eu tenho uma lista enorme, isso porque sinceramente não parei para analisar, a situação é que eu teria que percorrer essas pastas, entrar e pegar o Name dentro do Connection e só assim eu conseguirei obter o que necessito; Outros adaptadores que são inativos, ou não existe fica dessa maneira; Como faço isso ? pegar o nome especifico eu consegui, porém nesse caso terei que percorrer essas pastas e em cada uma acessar o Connection e pegar quem está ativo.
  5. Jhonas, testei aqui em ambos windows e infelizmente não deu certo, ele não traz os nomes do Adaptador, vou mudar a tática, vou verificar qual S.O. tem instalado no PC e vou passar o nome da rede para verificar....
  6. Não Jhonas....são esses 1ª Imagem é do Windows 8, 2ª Imagem é do Windows 10 e 3ª Imagem é do XP.
  7. Jhonas, mas esses exemplos lista o IP e nome do computador, não do adaptador de Rede
  8. já tentei esses ai Jhonas, todos que pesquisei não tive sucesso....
  9. Boa tarde, Criei um processo para alterar o IP do computador sem precisar reiniciar, porém nesse metodo tenho que passar o nome do adaptador de rede que infelizmente dependendo do SO e do adaptador isso muda, por exemplo XP "Conexão Local", W8 "Ethernet" e W10 "Rede", então qual minha ideia.... é pegar o nome desse adaptador, porém não achei como fazer....
  10. show consegui Jhonas era erro meu aqui
  11. tentei, mas não funcionou...por exemplo esse; if Win32Platform = VER_PLATFORM_WIN32_NT then begin comando := 'cmd /cnetsh interface ip set address "Conexão local" static '+txIp.Text+' 255.255.254.0 10.11.1.1 1'; WinExec(PChar(comando), SW_SHOWNORMAL) end else begin MessageBox(Handle, 'esse Comando não pode ser rodado fora da plataforma NT', 'NETSH', MB_ICONWARNING); end;
  12. Bom dia, sim, mas queria pelo delphi, para que não precisamos abrir as configurações para alterar.
  13. Como faço para alterar o ip do pc ?
  14. Boa noite, desculpe a demora Jhonas, mas hoje fiquei fora, nesse caso então terei que criar várias threads para dividir o processo, no loop onde percorro os registros terei que passar cada um para uma thread no final do processo de todas terei que verificar se existe mais para fazer o mesmo processo, acho que entendi....ficará grande criar umas 10 pelo menos, mas já vou mandar 10 posts ao mesmo tempo para a api, pelo menos os 10 vai me retornar mais rapido do que mandando 1 há 1.
  15. Uma coisa que não entendi é que nesse caso só executa a rotina 0 4 vezes, as demais não executa, se colocar as demais no syncronize do execute ai executa as 4, 4 vezes. O que não estou conseguindo fazer é como criar x thread diferentes que cada uma executa x rotina diferente e esperar que essas x termine para iniciar mais.
  16. Bom dia, Jhonas já havia vistos esses exemplos mas não consegui entender e adatpar ao meus problemas.... Não sei o que e como fazer.... :'(
  17. sinceramente estou sem saber o que fazer e como solucionar isso, agilizar esse processo, porque se eu mandar varios posts ao mesmo tempo a api aguenta, mas tem que ser por demanda.... :( tentei agora algo mais enxuto.... procedure TfrmPSyncBack.Button4Click(Sender: TObject); var linha: TStringList; NomeDoLog, texto: string; Arquivo: TextFile; nrCoo, idCaixa, cdEmp, JSON: string; begin linha := TStringList.Create; NomeDoLog := ExtractFilePath(Application.ExeName) + 'log\jsonPSyncBack_21062017_1232.json'; AssignFile(Arquivo, NomeDoLog); {$I-} Reset(Arquivo); {$I+} while (not eof(Arquivo)) do begin readln(Arquivo, texto); linha.Delimiter := '|'; linha.StrictDelimiter := true; linha.DelimitedText := texto; JSON := linha[0]; nrCoo := linha[1]; idCaixa := linha[2]; cdEmp := linha[3]; TThread.CreateAnonymousThread(procedure begin //função de postar o json postJSON(linha[0],linha[1],linha[2],linha[3],'VENDA'); Sleep(100); end).Start(); end; CloseFile(Arquivo); linha := nil; end; mas ele berrou....arquivo com mais de 5300 linhas
  18. Jhonas não consegui adaptar a minha realidade.... function TfrmPSyncBack.MinhaThreadSync(P: Pointer): LongInt; var linha: TStringList; a, nrAcu, total, ts :integer; aux : Currency; lista : TStringList; NomeDoLog, texto: string; Arquivo: TextFile; HTTP: TIdHTTP; RequestBody: TStream; ResponseBody, retorno, nrCoo, idCaixa, cdEmp, JSON: string; qryTeste: TFDQuery; begin linha := TStringList.Create; lista := TStringList.Create; NomeDoLog := ExtractFilePath(Application.ExeName) + 'log\jsonPSyncBack_20062017_1933.json'; AssignFile(Arquivo, NomeDoLog); Rewrite(Arquivo); lista.LoadFromFile(ExtractFilePath(Application.ExeName) + 'log\jsonPSyncBack_20062017_1933.json'); while (not eof(Arquivo)) do begin readln(Arquivo, texto); linha.Delimiter := '|'; linha.StrictDelimiter := true; linha.DelimitedText := texto; JSON := linha[0]; nrCoo := linha[1]; idCaixa := linha[2]; cdEmp := linha[3]; // MyThread := TThread.CreateAnonymousThread(procedure begin qryTeste := nil; qryTeste := TFDQuery.Create(qryTeste); qryTeste.Connection := DtmPSyncBack.conPlatinum; HTTP := TIdHTTP.Create; try try RequestBody := TStringStream.Create(JSON,TEncoding.UTF8); try HTTP.Request.Accept := 'application/json'; HTTP.Request.ContentType := 'application/json;charset=utf-8;'; HTTP.Request.BasicAuthentication := true; HTTP.Request.Connection := 'keep-alive'; ResponseBody := UTF8ToString(HTTP.Post('http://user:pass@host:port/api/teste/pedido/inclui',RequestBody)); qryTeste.Close; qryTeste.SQL.Text := 'insert into tbl_adm_logintegracao (cd_empresa,nr_coo,nr_idcaixa,tp_log,ds_log,ds_json,ds_pedidov,dt_cadastro)'+ ' values ('+#39 +cdEmp+#39+','+#39 +nrCoo+#39+','+#39 +idCaixa+#39+','+#39 +'OK'+#39+','+#39 +'OK'+#39+','+ #39 +JSON+#39+','+#39 +ResponseBody+#39+',CURRENT_TIMESTAMP)'; qryTeste.ExecSQL; finally RequestBody.Free; end; except on E: EIdHTTPProtocolException do begin qryTeste.Close; qryTeste.SQL.Text := 'insert into tbl_adm_logintegracao (cd_empresa,nr_coo,nr_idcaixa,tp_log,ds_log,ds_json,dt_cadastro)'+ ' values ('+#39 +cdEmp+#39+','+#39 +nrCoo+#39+','+#39 +idCaixa+#39+','+#39 +'ERRO'+#39+','+#39+E.ErrorMessage+#39+','+ #39 +JSON+#39+',CURRENT_TIMESTAMP)'; qryTeste.ExecSQL; end; on E: Exception do begin end; end; finally HTTP.Free; end; Sleep(100); // end).Start; end; CloseFile(Arquivo); linha := nil; end; procedure TfrmPSyncBack.Button3Click(Sender: TObject); var hThreadID :THandle; ThreadID :DWord; begin {Cria a Thread, onde @MinhaThread é o Ponteiro da Função criada} hThreadID := CreateThread(nil, 0, @MinhaThreadSync, nil, 0, ThreadID); end; estou com erro....
  19. Bom dia, Jhonas já vi vários exemplos mas não consegui adaptar esse conceito.... Eu fiz dessa maneira... procedure TfrmPSyncBack.Button2Click(Sender: TObject); var linha: TStringList; a, nrAcu, total, ts :integer; aux : Currency; lista : TStringList; NomeDoLog, texto: string; Arquivo: TextFile; HTTP: TIdHTTP; RequestBody: TStream; ResponseBody, retorno, nrCoo, idCaixa, cdEmp, JSON: string; qryTeste: TFDQuery; begin linha := TStringList.Create; lista := TStringList.Create; //gerei um arquivo(txt) com a extensão json para carregar e executar no loop; //o arquivo contem o numero do cupom, id caixa, empresa e o json separados por | //esses parametros uso para gravar junto com o retorno. NomeDoLog := ExtractFilePath(Application.ExeName) + 'log\jsonPSyncBack_20062017_1933.json'; AssignFile(Arquivo, NomeDoLog); {$I-} Reset(Arquivo); {$I+} lista.LoadFromFile(ExtractFilePath(Application.ExeName) + 'log\jsonPSyncBack_20062017_1933.json'); while (not eof(Arquivo)) do begin readln(Arquivo, texto); linha.Delimiter := '|'; linha.StrictDelimiter := true; linha.DelimitedText := texto; nrCoo := linha[0]; idCaixa := linha[1]; cdEmp := linha[2]; JSON := linha[3]; MyThread := TThread.CreateAnonymousThread(procedure begin qryTeste := nil; qryTeste := TFDQuery.Create(qryTeste); qryTeste.Connection := DtmPSyncBack.conPlatinum; HTTP := TIdHTTP.Create; try try RequestBody := TStringStream.Create(JSON,TEncoding.UTF8); try HTTP.Request.Accept := 'application/json'; HTTP.Request.ContentType := 'application/json;charset=utf-8;'; HTTP.Request.BasicAuthentication := true; HTTP.Request.Connection := 'keep-alive'; ResponseBody := UTF8ToString(HTTP.Post('http://user:password@host:port/api/teste/pedido/inclui',RequestBody)); qryTeste.Close; qryTeste.SQL.Text := 'insert into tbl_adm_logintegracao (cd_empresa,nr_coo,nr_idcaixa,tp_log,ds_log,ds_json,ds_pedidov,dt_cadastro)'+ ' values ('+#39 +cdEmp+#39+','+#39 +nrCoo+#39+','+#39 +idCaixa+#39+','+#39 +'OK'+#39+','+#39 +'OK'+#39+','+ #39 +JSON+#39+','+#39 +ResponseBody+#39+',CURRENT_TIMESTAMP)'; qryTeste.ExecSQL; finally RequestBody.Free; end; except on E: EIdHTTPProtocolException do begin qryTeste.Close; qryTeste.SQL.Text := 'insert into tbl_adm_logintegracao (cd_empresa,nr_coo,nr_idcaixa,tp_log,ds_log,ds_json,dt_cadastro)'+ ' values ('+#39 +cdEmp+#39+','+#39 +nrCoo+#39+','+#39 +idCaixa+#39+','+#39 +'ERRO'+#39+','+#39+E.ErrorMessage+#39+','+ #39 +JSON+#39+',CURRENT_TIMESTAMP)'; qryTeste.ExecSQL; end; on E: Exception do begin end; end; finally HTTP.Free; end; end); end; CloseFile(Arquivo); linha := nil; end; dados do arquivo .json 4|83653|22|[{"cod_pedidov":"4.83653.22","vitrine":4,"data_emissao":"2017-04-06","data_entrega":"2017-04-06","total":46.97,"quantidade":3,"n_serie":"BE091110100011237675","modelo":"ECF","numecf":22,"nota":83653,"serie":"1","faturar":"I","produtos":[{"item":1,"quantidade":1,"preço":19.99},{"item":2,"quantidade":1,"preço":13.99},{"barra":"2251202415835","item":3,"quantidade":1,"preço":12.99}],"lancamentos":[{"data_vencimento":"2017-04-06","valor_inicial":46.97,"numparc":11,"desc_tipo":"NALIN CREDITO","desc_bandeira":"NALIN","autorizacao":"400786","nsu":"000000444918"}],"dados_cliente":[{"nome":"CONSUMIDOR FINAL","vitrine":4,"endereco":[{"cep":"25225660","numero":""}]}]}] 4|180549|20|[{"cod_pedidov":"4.180549.20","vitrine":4,"data_emissao":"2017-04-10","data_entrega":"2017-04-10","total":68.93,"quantidade":7,"n_serie":"BE091110100011237014","modelo":"ECF","numecf":20,"nota":180549,"serie":"1","faturar":"I","produtos":[{"item":1,"quantidade":1,"preço":29.99},{"barra":"2251204175348","item":2,"quantidade":1,"preço":2.99},{"barra":"2251204175348","item":3,"quantidade":1,"preço":2.99},{"barra":"2251204175348","item":4,"quantidade":1,"preço":2.99},{"barra":"2251203876925","item":5,"quantidade":1,"preço":9.99},{"barra":"2251203876925","item":6,"quantidade":1,"preço":9.99},{"barra":"2251203876925","item":7,"quantidade":1,"preço":9.99}],"lancamentos":[{"data_vencimento":"2017-04-10","valor_inicial":68.93,"numparc":0,"desc_tipo":"DINHEIRO"}],"dados_cliente":[{"nome":"CONSUMIDOR FINAL","vitrine":4,"endereco":[{"cep":"25225660","numero":""}]}]}] 4|179469|20|[{"cod_pedidov":"4.179469.20","vitrine":4,"data_emissao":"2017-04-01","data_entrega":"2017-04-01","total":19.99,"quantidade":1,"n_serie":"BE091110100011237014","modelo":"ECF","numecf":20,"nota":179469,"serie":"1","faturar":"I","produtos":[{"barra":"2251203757378","item":1,"quantidade":1,"preço":19.99}],"lancamentos":[{"data_vencimento":"2017-04-01","valor_inicial":19.99,"numparc":0,"desc_tipo":"DINHEIRO"}],"dados_cliente":[{"nome":"CONSUMIDOR FINAL","vitrine":4,"endereco":[{"cep":"25225660","numero":""}]}]}] 4|84197|22|[{"cod_pedidov":"4.84197.22","vitrine":4,"data_emissao":"2017-04-10","data_entrega":"2017-04-10","total":201.51,"quantidade":9,"n_serie":"BE091110100011237675","modelo":"ECF","numecf":22,"nota":84197,"serie":"1","faturar":"I","produtos":[{"item":1,"quantidade":1,"preço":9.83444},{"item":2,"quantidade":1,"preço":9.83444},{"barra":"2251204456515","item":3,"quantidade":1,"preço":13.83444},{"item":4,"quantidade":1,"preço":38.83444},{"item":5,"quantidade":1,"preço":13.83444},{"barra":"2251204708102","item":6,"quantidade":1,"preço":28.83444},{"item":7,"quantidade":1,"preço":18.83444},{"item":8,"quantidade":1,"preço":38.83444},{"item":9,"quantidade":1,"preço":28.83444}],"lancamentos":[{"data_vencimento":"2017-04-10","valor_inicial":201.51,"numparc":1,"desc_tipo":"NALIN CREDITO","desc_bandeira":"NALIN","autorizacao":"400030","nsu":"000000449536"}],"dados_cliente":[{"nome":"CONSUMIDOR FINAL","vitrine":4,"endereco":[{"cep":"25225660","numero":""}]}]}] fazendo dessa forma acima....o processado fica 100% e aparentemente não está executando, porque não tenho retorno dos inserts....dos retornos do post, depois de uns 10 minutos eu tenho erro de Runtime error 214 at 01B001E. Creio que teria que fazer assim..... gerar 10 Threads com o post dentro....aguardar o retorno das 10, pois teoricamente as 10 está rodando ao mesmo tempo, então seria mais rapido que rodando 1 por vez e aguardando o retorno.... depois assim que retornar 1 já entra na fila outra....
  20. hum.;... não teria como criar Array de Threads ? mas mesmo assm é uma boa solução... o que estou tendo problema é que quando chamo o post pelo idHttp ele leva um tempo para ter a resposta, nesse caso teria que jogar 100 de uma vez sem aguardar a resposta, mas esperar que vá liberando as 100 para ir entrando mais....isso que estou pedindo e não sabendo como montar.
  21. enho um aplicativo para consultar as vendas de uma banco postgre, jogo os registros na query e faço um loop pegando os produtos e pagamentos de cada venda e montando um JSON, após montado o JSON realizo um post em um webservice de outro software de terceiro(erp principal), tudo isso coloquei dentro do processo de uma thread, consultando pelo log a cada 4 há 6 segundos monta o json e faz o post no webservice, a situção é que em 1 mes de venda de apenas um loja tenho em media 25.000 vendas isso está dando mais de 24 horas executando.Com isso comecei a caçado sobre pool de thread, parallel e tasks, na verdade não sei o que usar e qual maneira corretamente, já vi vários videos, li artigos, mas não consegui materializar tudo em linha de codigo com meu problema, na verdade estava pretendendo enviar 100 posts no webservice, pois vários ao mesmo tempo a api consegue processar rapidamente, então o que preciso é de uma ajuda se realizo com pool de tread, parallel ou task...Para terem uma noção melhor montei um exemplo que chega bem proximo do modelo funcional do processo, como existe varias consultas e validação, creio que não compensa postar o codigo.... unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type MinhaThread = class(TThread) procedure Execute; override; procedure Verifica; procedure Fechar; Private constructor Create(); end; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } thread: MinhaThread; public { Public declarations } procedure consultaProcesso(Sender: TObject); procedure postJSON(JSON:String); end; var Form1: TForm1; I : Integer; JSON:String; implementation {$R *.dfm} { MinhaThread } constructor MinhaThread.Create; begin inherited Create(True); FreeOnTerminate := True; Priority := tpLower; Resume; end; procedure MinhaThread.Execute; Var Sender : TObject; begin Synchronize(Verifica); Form1.consultaProcesso(Sender); // Executar Rotina ( Procedures ) while not Terminated do begin Sleep (10); Terminate; // Finaliza a Thread Synchronize(Fechar); end; end; procedure MinhaThread.Fechar; begin //application.terminate; end; procedure MinhaThread.Verifica; begin Form1.Caption := 'EXECUTANDO...'+IntToStr(I); end; { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin thread := MinhaThread.Create(); end; procedure TForm1.consultaProcesso(Sender: TObject); begin //exemplo com o for // porem aqui eu percorro a query, passo // para a variavel JSON o json que está na query // e chamo o metodo post for I := 0 to 100 do begin postJSON(JSON); end; end; procedure TForm1.postJSON(JSON: String); begin //faz um post pelo idHTTP; Memo1.Lines.Add(DateTimeToStr(now)+ ' - Executando JSON '+IntToStr(I)); //para simular um tempo de espera do retorno Sleep(1000); //retorno... Memo1.Lines.Add(DateTimeToStr(now)+ ' - Retorno JSON '+IntToStr(I)); end; end.
  22. o Exemplo é esse mesmo, mas no memo eu tenho o meu json de retorno (mesmo que seja o erro). Mas consegui resolver assim: procedure Button1Click(Sender: TObject); var jsonObj, jSubObj: TJSONObject; jv: TJSONValue; begin jsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Text), 0) as TJSONObject; Memo1.Lines.Clear; jv := jsonobj.Get('error').JsonValue; jsubObj := jv as TJSONObject; jv := jsubObj.Get('message').JsonValue; jsubObj := jv as TJSONObject; jv := jsubObj.Get('value').JsonValue; ShowMessage(jv.Value); end;
  23. Bom dia,Eu tenho um retorno do JSON que está em uma variavel String e quero pegar o value dele....Esse é o meu JSON {"error":{"code":400,"message":{"lang":"en-us","value":"Bad request: Error in parameter n_serie:Attribute \\"n_serie\\" not found in pedido_venda.inclui"}}} quero só pegar a informação do value; tentei fazer dessa maneira; procedure TfrmPSyncBack.Button1Click(Sender: TObject); var jsonObj, jSubObj: TJSONObject; já: TJSONArray; jp, jSubPar: TJSONPair; i, j: integer; begin jsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Text), 0) as TJSONObject; //dada a seguinte string em notação JSON que será convertida pela função ParseJSONValue //em um objeto nativo do delphi do tipo TJSONObject Memo1.Lines.Clear; jp := TJSONPair.Create; jp := jsonObj.Get(0); //pega o par zero já := TJSONArray.Create; já := (jp.JsonValue as TJSONArray); // do par zero pega o valor, que é array //quantidade de pares do objeto Memo1.Lines.Add('quantidade de elementos ' + IntToStr(já.Size)); jSubObj:= TJSONObject.Create; jSubPar := TJSONPair.Create; for i := 0 to já.Size - 1 do //itera o array para pegar cada elemento begin jSubObj := (já.Get(i) as TJSONObject); //pega cada elemento do array, onde cada //elemento é um objeto, neste caso, em função da string JSON montada acima Memo1.Lines.Add(''); Memo1.Lines.Add('No elemento ' + IntToStr(i) + ' a quantidade de pares do objeto é = ' + IntToStr(jSubObj.Size) ); //quantidade de pares do objeto for j := 0 to jSubObj.Size - 1 do //itera o objeto para pegar cada par begin jSubPar := jSubObj.Get(j); //pega o par no índice j //do par pega separado a chave e o valor usando Value Memo1.Lines.Add(jSubPar.JsonString.Value + ' : ' + jSubPar.JsonValue.Value); end; end; end; mas no já := (jp.JsonValue as TJSONArray); eu tenho esse erro First chance exception at $73F4A9F2. Exception class EInvalidCast with message 'Invalid class typecast'.
×
×
  • Criar Novo...