Ir ao conteúdo
  • Cadastre-se

jeffersoncg

Membro Júnior
  • Posts

    16
  • Cadastrado em

  • Última visita

posts postados por jeffersoncg

  1. Olá, estou tentando pegar os saldos via SQL, mas estou tendo muito dificuldade em otimiza-lo.

    Tenho o seguinte código: 

    SELECT (SELECT ROUND(SUM(E.Valor), 2) AS "CREDITO" FROM extratos E
    INNER JOIN `ctritensacessos` Ct ON Ct.Classe = "PLANOCONTAS" AND Ct.Usuario = :pUsuario AND Ct.Permitido = 1
    INNER JOIN planocontas Pc ON Pc.Codigo = Ct.Codigo AND Pc.Ativado = 1
    WHERE E.Doc = Pc.Sigla AND E.Contaid = :pEstab AND E.CD = "C" AND DATA BETWEEN :pDataInicio AND :pDataFim) AS CREDITO,
    (SELECT ROUND(SUM(E.Valor), 2) AS "DEBITO" FROM extratos E
    INNER JOIN `ctritensacessos` Ct ON Ct.Classe = "PLANOCONTAS" AND Ct.Usuario = :pUsuario AND Ct.Permitido = 1
    INNER JOIN planocontas Pc ON Pc.Codigo = Ct.Codigo AND Pc.Ativado = 1
    WHERE E.Doc = Pc.Sigla AND E.Contaid = :pEstab AND E.CD = "D" AND DATA BETWEEN :pDataInicio AND :pDataFim) AS DEBITO,
    ((SELECT ROUND(SUM(E.Valor), 2) AS "CREDITO" FROM extratos E
    INNER JOIN `ctritensacessos` Ct ON Ct.Classe = "PLANOCONTAS" AND Ct.Usuario = :pUsuario AND Ct.Permitido = 1
    INNER JOIN planocontas Pc ON Pc.Codigo = Ct.Codigo AND Pc.Ativado = 1
    WHERE E.Doc = Pc.Sigla AND E.Contaid = :pEstab AND E.CD = "C" AND DATA < :pDataFim)-
    (SELECT ROUND(SUM(E.Valor), 2) AS "DEBITO" FROM extratos E
    INNER JOIN `ctritensacessos` Ct ON Ct.Classe = "PLANOCONTAS" AND Ct.Usuario = :pUsuario AND Ct.Permitido = 1
    INNER JOIN planocontas Pc ON Pc.Codigo = Ct.Codigo AND Pc.Ativado = 1
    WHERE E.Doc = Pc.Sigla AND E.Contaid = :pEstab AND E.CD = "D" AND DATA < :pDataFim)) AS SALDOANTERIOR

     

    Tentei fazer todo o código com Inner Join, mas a única coisa que conseguir foi travar minha base.

     

    A ideia é pegar da base "Extratos" todo o movimento Crédito, Débito, e o Saldo(Crédito-Débito)+Saldo Anterior(Crédito-Débito do período anterior ao atual), mas apenas com condições extremamente fechadas, como descrito abaixo.

    SELECT ROUND(SUM(E.Valor), 2) AS "CREDITO" FROM extratos E
    INNER JOIN `ctritensacessos` Ct ON Ct.Classe = "PLANOCONTAS" AND Ct.Usuario = :pUsuario AND Ct.Permitido = 1
    INNER JOIN planocontas Pc ON Pc.Codigo = Ct.Codigo AND Pc.Ativado = 1
    WHERE E.Doc = Pc.Sigla AND E.Contaid = :pEstab AND E.CD = "C" AND DATA BETWEEN :pDataInicio AND :pDataFim) AS CREDITO

     

    Acima, soma o Crédito apenas das contas quais os PLANOS DE CONTA aos quais o usuário tem ('ctritensacessos').

     

    Tentei ao como 'INNER JOIN extratos Cred', 'INNER JOIN extratos Deb', mas a base apenas trava por excesso de uso, será que tem algum jeito de melhorar esse código sem fazer esse monte de SELECT?

     

    Agradeço muito a ajuda.

  2. 10 minutos atrás, PlayerUzumaki disse:

    @jeffersoncg Não faz sentido ter duas GPUs hoje em dia, só pegue a RTX 3060 Ti ou a 3080 mesmo, (além de que duas 2070 ainda iam ser mais fracas que a 3060 Ti), SLI morreu faz anos (desde as GTX 900 já não eram algo para jogos), hoje SLI só é válido para produtividade como renderização ou edição em 4k e coisas do tipo.

    Ah sim, entendi, tem alguma marca em especifico que recomende? Eu vi que tem várias, Evga, Asus e tal...

    Não sei entre qual escolher, tem diferença?

  3. Olá, estou querendo comprar uma placa de video para meu computador, mas não sei qual comprar, estou querendo uma placa boa, preferencialmente com Ray Tracing.

    Algo que consiga rodar graficos desses abaixo.

    Meu pc usa graficos integrados, então só consigo jogar alguns jogos, e com gráficos no mínimo, sempre em modo janela 720p, isso quando os jogos pegam.

     

    Graficos:

    Spoiler

    image.thumb.png.8e7dae6168e53b19df7830b2fc5054ba.png

    image.thumb.png.79842232c6e4d94ac0f0ef4a522205dc.png

    image.thumb.png.f84027016ec5c1550039a82584b88794.png

     

    CPU Z:

     

    Spoiler

    image.png.a0d0f4a8d88350b7200ce17c6a777a03.pngimage.png.fbd9d3800571c47bfaf5eecf092c0148.pngimage.png.bc0dc37f11af863880f2f65a55280ab5.pngimage.png.afe5d8dfe8bd0e980f33f20d3b0d49dd.pngimage.png.2ee5616803fb6724e114fb6e1f1d9bce.png

     

    Especificações:

    Sistema Operacional: Windows 10 X64 - Enterprise

    placa-mãe: ROG MAXIMUS X HERO (WI-FI AC)

    Memoria: 32GB DDR4 - 2666 (2x16)

    Armazenamento: 2X256GB SSD M.2 (Raid), 3X1TB HDD Interno (Raid), 1X2 TB HDD Externo, 1X10TB HDD Externo

    Cooler: Water Cooler Corsair H100X Hydro Series

    Processador: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz 

    Fonte: Corsair 1000W 80 Plus Gold Modular RM1000X 

     

    Gostaria se possivel de uma placa da linha RTX, não sei se são compativeis com minha placa-mãe, mas se for, alguma que me permita rodar jogos pessados e com ótimos graficos.

     

    Realmente agradeço a ajuda.

     

    Obs: Não sei se é assim que se posta as imagens, mas como não consegui de outra forma...

     

     

  4. 2 horas atrás, Fazzioni disse:

     

     

    @jeffersoncg  ai você precisa instanciar como Tcomponent

     

     

    exemplo:

     

    
    type
      Tcomp = class (TComponent)
      private
        propri: String;
    end;
    
    procedure TForm1.test;
    var
     	com : Tcomp;
    begin
    	com := Tcomp.Create(self);
    	com.propri := 'my variable';
    	com.Name := 'com';
    	ShowMessage( Tcomp(FindComponent('com')).propri);
    end;
    
    

     

     

     

     

     

    Muito obrigado Fazzioni,  deu certinho, passei boa parte dos itens para FindComponent, já que as telas de busca/filtro são as mesmas e eu ficava copiando e colando o codigo em todos os Form's, agora tenho apenas no form "Modulo", e nas outras apenas seguem com o mesmo nome e o codigo identifica qual objeto chamar. Obrigado de verdade amigo.

    • Curtir 1
  5. Boa tarde, estou tendo uma dificuldade de criar um Obejeto no delphi, preciso achar um jeito fácil de chamar esse objeto, preferencialmente através do "FindComponent", mas não sei ao certo como fazer a criação de objetos, tentei de varias formas  e em todas me resultou erro.

     

    O record que tenho é o seguinte:

     

    type
      TFiltroComboBox = record
        Itens: TStringList;
        Ids: TStringList;
        procedure Create;
        procedure Free;
        procedure Clear;
        procedure Adicionar(Texto: string; Id: Integer);
        procedure Remover(Index: Integer);
        function Count: Integer;
        function Created:Boolean;
      end;

     

    Estou usando a função "Create" apenas para inicializar as TStringList, a free para limpar o record, e a Clear somente para zerar as TStringList.

     

    Seria possivel passar isso para TObject?

    Ai quando eu precisasse localiza-lo pelo nome, eu apenas faria "Form.FindComponent('Component')".

     

    Realmente agradeço a ajuda, estou tentando otimizar o codigo do meu sistema, e a localização dos componentes vai me ajudar muito nisso, já que eu estou sempre indicando o record manualmente em cada uso, sendo que eu poderia padronizar os nomes dos components e fazer a busca pelo nome, assim chegando ao objeto que quero.

     

  6. 16 minutos atrás, Fazzioni disse:

    @jeffersoncg  aparentemente é um código válido, tente utilizar o breakpoint do delphi para verificar se a função está percorrendo a lista...

     

    outra forma de fazer a mesma coisa:

    
    procedure setHints(form:string);
    var
      cfg : TIniFile;
      i : integer;
      comp : TComponent;
      s : string;
    begin
     try
      comp := Application.FindComponent(form);
      if not Assigned(comp) then exit;
    
      cfg :=  TIniFile.Create(ExtractFilePath(Application.ExeName)+'Hints.ini');
      if not cfg.SectionExists(form) then
      exit;
    
        for i := 0 to comp.ComponentCount -1 do
        begin
          s := cfg.ReadString(comp.Name,comp.Components[i].Name,'');
          if (s <> '') and (comp.Components[i] is TControl) then
          with (comp.Components[i] as TControl) do
          begin
           Hint := s;
           ShowHint := true;
          end;
        end;
      finally
        FreeAndNil(cfg);
      end;
    end;

     

     

    Amigo era isso mesmo, eu não queria ter que rodar por todo o form e ele ler component por component, já que a lista era pré definida, ai no caso iria mais rápido.

    O meu código lá de cima não pegava por causa do " as TControl".

     

    Coloquei como você fez ai, e deu certo.

    with (IComp as TControl) do
              begin
                ShowHint := xHint <> EmptyStr;
                Hint := UTF8ToUnicodeString(xHint);
              end;

     

    Muito obrigado mesmo Fazzioni.

  7. Olá, estou tendo um pequeno problema no Delphi, estou tentando carregar um arquivo Ini, e jogar as configurações setadas nesse ini, nos objetos do form, nesse caso em especifico, os Hints.

    Mas não importa como eu altere essa função, ele não altera os hints do do form, apesar que (na minha cabeça) não parece ter erro nesse código.

     

    
    procedure TModulo.CarregarHints(Form: String);
    var
      ArqIni: TIniFile;
      IForm: TForm;
      IComp: TComponent;
      x, CompMax: Integer;
      CompList: TStringList;
      xHint: String;
    begin
      Form := PegarNomeForm(Form);
      ArqIni := TIniFile.Create(Config.Desconto_PathConfig+'Hints.ini');
      try
        if not ArqIni.SectionExists(Form) then
          Exit;
        IComp := Application.FindComponent(Form);
        if Assigned(IComp) then
          IForm := TForm(IComp)
        else
          Exit;
        CompList := TStringList.Create;
        ArqIni.ReadSection(Form, CompList);
        CompMax := CompList.Count-1;
        for x := 0 to CompMax do
        begin
          try
            IComp := IForm.FindComponent(CompList[x]);
            if Assigned(IComp) then
            begin
              xHint := Trim(StringReplace(ArqIni.ReadString(Form, CompList[x], ''), '#13', #13, [rfReplaceAll, rfIgnoreCase]));
              TForm(IComp).ShowHint := xHint <> EmptyStr;
              TForm(IComp).Hint := UTF8ToUnicodeString(xHint);
            end;
          except
            on E: Exception do
              ShowMessage(E.Message);
          end;
        end;
      finally
        IForm := nil;
        IComp := nil;
        if Assigned(CompList) then
          FreeAndNil(CompList);
        FreeAndNil(ArqIni);
      end;
    end;

     

    Com esse código, ele carregaria os hints, e jogaria em cada um dos componentes que estivessem escritos no ini.

     

    Eu consegui fazer ele funcionar com o código:

     

    Onde: THintsControl é um record com duas array's:

    ArrayA: Array of Integer; //Guarda o Index do Componente

    ArrayB: Array of String; //Guarda o Hint do Componente

     

    function TModulo.CarregarHints(Form: String):THintsControl;
    var
      ArqIni: TIniFile;
      IForm: TForm;
      IComp: TComponent;
      x, CompMax, CompIndex: Integer;
      CompList: TStringList;
      xHint: String;
    begin
      Form := PegarNomeForm(Form);
      ArqIni := TIniFile.Create(Config.Desconto_PathConfig+'Hints.ini');
      try
        if not ArqIni.SectionExists(Form) then
          Exit;
        IComp := Application.FindComponent(Form);
        if Assigned(IComp) then
          IForm := TForm(IComp)
        else
          Exit;
        CompList := TStringList.Create;
        ArqIni.ReadSection(Form, CompList);
        CompMax := CompList.Count-1;
        SetLength(Result.ComponentsIndex, CompMax+1);
        SetLength(Result.ComponentsHints, CompMax+1);
        for x := 0 to CompMax do
        begin
          try
            IComp := IForm.FindComponent(CompList[x]);
            if Assigned(IComp) then
            begin
              CompIndex := IComp.ComponentIndex;
              xHint := StringReplace(ArqIni.ReadString(Form, CompList[x], ''), '#13', #13, [rfReplaceAll, rfIgnoreCase]);
              Result.ComponentsIndex[x] := CompIndex;
              Result.ComponentsHints[x] := UTF8ToUnicodeString(xHint);
            end
            else
            begin
              Result.ComponentsIndex[x] := -1;
              Result.ComponentsHints[x] := '';
            end;
          except
            on E: Exception do
              ShowMessage(E.Message);
          end;
        end;
      finally
        IForm := nil;
        IComp := nil;
        if Assigned(CompList) then
          FreeAndNil(CompList);
        FreeAndNil(ArqIni);
      end;
    end;

     

     

    E depois, no form que estou querendo carregar os hints, eu faço :

     

    var
      x, xMax: integer;
    begin
      HintsCtr := Modulo.CarregarHints(Self.Name);
      with HintsCtr do
      begin
        xMax := Length(ComponentsIndex)-1;
        for x := 0 to xMax do
        begin
          if ComponentsIndex[x] > -1 then
            TEdit(CadVeiculos.Components[ComponentsIndex[x]]).Hint := ComponentsHints[x];
        end;
      end;
    end;

     

    Mas parece ser uma gambiarra gigantesca fazer assim. Não teria um jeito correto de fazer o primeiro código funcionar? Onde apenas informando o nome do form, eu consigo carregar os hints corretamente?

    Realmente agradeço a ajuda.

  8. Eu ia tentar lhe enviar por MP pra não fazer post desnecessário, mas como sou novo, não tenho permissão pra enviar MP.

    Aqui o código como consegui corrigir, não sei se essa é a maneira mais correta, mas é o máximo que consegui.

     

    SELECT
    vca.Codigo,
    MAX(vca.EstabCodigo) AS EstabCodigo,
    MAX(vca.EstabNome) AS EstabNome,
    MAX(vca.VendaCodigo) AS VendaCodigo,
    MAX(vca.CartaoCodigo) AS CartaoCodigo,
    MAX(vca.ConvCodigo) AS ConvCodigo,
    MAX(vca.ClienteCodigo) AS ClienteCodigo,
    MAX(vca.ClienteNome) AS ClienteNome,
    MAX(vca.ValorBruto) AS ValorBruto,
    MAX(vca.ValorLiquido) AS ValorLiquido,
    MAX(vca.Taxa) AS Taxa,
    MAX(vca.DescJur) AS DescJur,
    MAX(vca.VeiculoCodigo) AS VeiculoCodigo,
    MAX(vca.VeiculoPlaca) AS VeiculoPlaca,
    MAX(vca.VeiculoModelo) AS VeiculoModelo,
    MAX(vca.MotoristaCodigo) AS MotoristaCodigo,
    MAX(vca.MotoristaNome) AS MotoristaNome,
    MAX(vca.DataVenda) AS DataVenda,
    MAX(vca.HoraVenda) AS HoraVenda,
    MAX(vca.VeiculoKM) AS KMAtual,
    MAX(IFNULL(vcant.VeiculoKM, vei.KMInicial)) AS KMAnterior,
    MIN(IFNULL(vca.VeiculoKM-IFNULL(vcant.VeiculoKM, vei.KMInicial), 0)) AS KMPercorrido,
    SUM(IFNULL(vdet.quantidade, 0)) as LitrosAbastQuant,
    SUM(IFNULL(vdet.valorliquido, 0)) as LitrosAbastValor,
    MAX((IFNULL(vca.VeiculoKM-IFNULL(vcant.VeiculoKM, vei.KMInicial), 0)/(IFNULL(vdet.quantidade, 0)))) AS MediaAtual FROM vendascartao vca
    LEFT JOIN vendascartao vcant ON vcant.VeiculoCodigo = vca.VeiculoCodigo AND vca.DataHora > vcant.DataHora
    JOIN veiculos vei ON vei.codigo = vca.VeiculoCodigo
    JOIN vendasdetalhamento vdet ON vdet.VendaCodigo = vca.VendaCodigo AND vdet.ProdutoCod = vei.CombustivelCodigo
    GROUP BY vca.codigo

     

    Mais uma vez Joseph, obrigado, tu salvou meu sistema, já que ele é totalmente baseado em controle de frota, e precisava funcionar sem muita lentidão, já que vai estar em computadores fora da rede, via internet.

  9. 21 minutos atrás, joseph_dev disse:

    Quando você usa o MAX() sem agrupar por algum campo (GROUP BY) automaticamente o mysql entende que você está agrupando no geral. Por isso só retorna o maior campo desse geral e agrupa todos os resultados em um.

     

    Pelos campos dessa consulta eu acredito que você precisa fazer um LEFT com vendascartao (já que ele pode retornar NULL):

    
    SELECT
    car.Codigo,
    MAX(Uid),
    MAX(Serial),
    MAX(ConvenioId),
    MAX(ConvenioNome),
    MAX(UtilizadorId),
    MAX(UtilizadorNome),
    MAX(car.CartaoNumero),
    MAX(Ativado),
    MAX(DtCadastro),
    MAX(DtUltPassagem),
    MAX(Historico),
    MAX(Senha),
    MAX(Bloqueado),
    MAX(VeiculoId), 
    MAX(car.Placa),
    MAX(car.MarcaModelo),
    CONCAT(MAX(vei.AnoFab), "/",MAX(vei.AnoMod)) AS Ano,
    MAX(IFNULL(vca.VeiculoKM, KmInicial)) AS UltimoKM,
    /*se der erro tente assim: IFNULL(MAX(vca.VeiculoKM), MAX(KmInicial)) AS UltimoKM --não tive como testar*/
    MAX(fun.Codigo) AS MotoristaCodigo,
    MAX(fun.Nome) AS MotoristaNome,
    MAX(fun.CPF) AS MotoristaCPF
    FROM cartoes car
    JOIN veiculos vei ON vei.Codigo = car.VeiculoId
    JOIN funcionarios fun ON fun.Codigo = vei.MotoristaCodigo
    LEFT JOIN vendascartao vca ON vca.VeiculoCodigo = car.VeiculoId
    GROUP BY car.Codigo

    Só tem que ver os campos do agrupador pois não sei a definição de sua consulta e nem o seu modelo... Estou sugerindo pelo que pude analisar no seu código. Nesse caso aí ele vai agrupar por cada cartão e vai trazer os campos do cartão, o carro utilizado, o funcionário cadastrado e vai trazer o maior registro VeiculoKm da vendascartao caso tenha algum.

     

    *Quando você usa o GROUP BY, para todos os campos que não estão no agrupador (na linha GROUP BY) você precisa usar o MAX() ou MIN() ou até AVG(), SUM(), etc, a depender de sua necessidade, é claro. Na maioria das vezes o MAX() é usado pois o campo vai ter o mesmo valor no agrupamento.

     

    *Eu não consegui identificar a tabela de cada campo no select. Depois coloque o alias de cada tabela em cada campo. É uma boa prática.

    Ex:

    Para campos da tabela cartoes o alias está car (eu defini aí mas você escolhe).

    Para campos da tabela funcionarios o alias está fun (eu defini aí mas você escolhe).

    Logo, no select, eu faço a seguinte referência:

    
    SELECT
    car.codigo,
    car.descricao,
    fun.codigo,
    fun.nome
    ...
    FROM cartoes car
    JOIN funcionarios fun ON fun.codigo = car.codfuncionario
    WHERE car.codigo = 10

     

    *Não sei qual a versão do seu MYSQL, mas dê preferência em usar caixa alta (maiúsculas) pelo menos nas palavras reservadas do SQL. Nos campos das tabelas, use como está definido no banco (maiúscula ou minúscula).

     

    Se não funcionar de primeira eu acredito que com um pequeno ajuste ao seu modelo já funcione.

     

    Muito obrigado Joseph, era exatamente isso que eu precisava, e obrigado também pela explicação. Consegui entender bem melhor agora como trabalhar com SQL.

    Estou utilizando a versão 5.7 do MYSQL, testei seu código aqui e funcionou perfeitamente. 

     

    Vou tentar adaptar o outro também.

    Mais uma vez, muito obrigado, e um forte abraço.

     

  10. Eu estou tentando seguir sua dica, e otimizar ele usando inner Join, mas me surgiu uma dúvida.

     

    Como eu converteria a função seguinte, sem que ela fizesse minha função inteira chamar apenas 1 Record?

     

    ifnull((select max(VeiculoKM) from vendascartao where vendascartao.VeiculoCodigo = Cartoes.VeiculoId), KmInicial) as UltimoKM

     

    Eu chamo assim, pois quando tento chama apenas o max(veiculoKm), ele faz toda a função retornar apenas um record, além eu não poder fazer verificações nele.

     

    Estou tentando chamar ele assim:

    Como aquele código acima esta muito bagunçado, estou tentando simplificar um mais simples, pra tentar entender melhor a "simplificação", ai tento simplificar ele também.

     

    O código que utilizo esse acima é o seguinte:

    select cartoes.Codigo, Uid, Serial, ConvenioId, ConvenioNome, UtilizadorId, UtilizadorNome, CartaoNumero, Ativado, DtCadastro, DtUltPassagem, Historico, Senha, Bloqueado, VeiculoId, 
    Placa, MarcaModelo, Concat(veiculos.AnoFab, "/",veiculos.AnoMod) as Ano, ifnull((select max(VeiculoKM) from vendascartao where vendascartao.VeiculoCodigo = Cartoes.VeiculoId), KmInicial) as UltimoKM,
    funcionarios.Codigo as MotoristaCodigo, funcionarios.Nome as MotoristaNome, funcionarios.CPF as MotoristaCPF
    from cartoes 
    inner join veiculos on veiculos.Codigo = cartoes.VeiculoId
    inner join funcionarios on funcionarios.Codigo = veiculos.MotoristaCodigo

  11. Eu estava pensando se não tem um jeito de alterar esses SubSelects repetidos, pra uma variavel, deixar apenas um Select, que passa o valor pra variavel e a variavel nos outros, pois varios dos selects são o mesmo, mas é que como são informações diferentes que são puxadas, eu preciso confirmar toda vez.

    Estava pensando em algo tipo:
     

    declare @DtLanc = CnvDt(DATAVENDA,HORAVENDA);
    declare @KmInicial = (select veiculos.KMInicial from veiculos where veiculos.codigo = vendascartao.veiculocodigo);
    declare @KmAnt = ifnull((SELECT max(VeiculoKM) from vendascartao as vendascartaoa where vendascartaoa.VeiculoCodigo = vendascartao.VeiculoCodigo and CnvDt(vendascartaoa.DATAVENDA,vendascartaoa.HORAVENDA) < @DtLanc), @KmInicial);
    declare @KmPerc = (VeiculoKM-@KmAnt, @KmInicial)))
    declare @CombCodigo = (select veiculos.CombustivelCodigo from veiculos where veiculos.Codigo = vendascartao.VeiculoCodigo);
    declare @LtsAbst = ifnull((select vendasdetalhamento.quantidade from vendasdetalhamento where vendasdetalhamento.VendaCodigo = vendascartao.VendaCodigo and vendasdetalhamento.ProdutoCod = @CombCodigo), 0);
    declare @MdAtual = ifnull(KmPerc/LtsAbst, 0);
    
    SELECT Codigo, EstabCodigo, EstabNome, VendaCodigo, CartaoCodigo, ConvCodigo, ClienteCodigo, ClienteNome, ValorBruto, ValorLiquido, Taxa, DescJur, VeiculoCodigo, VeiculoPlaca, VeiculoModelo, MotoristaCodigo, MotoristaNome,
    @DtLanc as DataEHora, VeiculoKM as KMAtual,  @KmAnt AS KMAnterior, KmPerc AS KMPercorrido, @LtsAbst AS LitrosAbst, @MdAtual as MediaAtual FROM `vendascartao`

     

    O que esta declarado como @Variavel são as definidas, as que não estão, são campos da tabela que vão contem informação.

     

    Seria possível fazer algo assim?
    Isso daria uma ótima reduzida no código, mas eu não entendo de SQL, então não sei a estruturação que se usa na hora de escrever um código.

  12. Bom dia, sou novo aqui no Clube do Hardware, mas sempre acompanhei as dicas que o pessoal passa, dessa vez resolvi me inscrever pra pedir ajuda também.

    Tenho esse código, mas ele tá muito mal otimizado, eu jogo ele em uma query no Delphi, mas como as vezes tem muitos resultados, fica muito lento.

    Eu não entendo de SQL, alguém poderia me ajudar a converter ele para uma função/procedimento ou otimiza-lo?

    Eu realmente agradeço, preciso muito desse código.

    As condições de busca, eu jogarei depois, ainda estou desenvolvendo essa parte.

     

    A função CnvDt apenas junta dois campos separados Date e Time em um DateTime pra poder fazer comparação de data e hora.

     

    SELECT Codigo, EstabCodigo, EstabNome, VendaCodigo, CartaoCodigo, ConvCodigo, ClienteCodigo, ClienteNome, ValorBruto, ValorLiquido, Taxa, DescJur, VeiculoCodigo, VeiculoPlaca, VeiculoModelo, MotoristaCodigo, MotoristaNome,
    CnvDt(DATAVENDA,HORAVENDA) as DataEHora, VeiculoKM as KMAtual,
    ifnull((SELECT max(VeiculoKM) from vendascartao as vendascartaoa where vendascartaoa.VeiculoCodigo= vendascartao.VeiculoCodigo and CnvDt(vendascartaoa.DATAVENDA,vendascartaoa.HORAVENDA) < CnvDt(vendascartao.DATAVENDA,vendascartao.HORAVENDA)), (select veiculos.KMInicial from veiculos where veiculos.codigo = vendascartao.veiculocodigo)) AS KMAnterior,
    (VeiculoKM-ifnull((SELECT max(VeiculoKM) from vendascartao as vendascartaoa where vendascartaoa.VeiculoCodigo= vendascartao.VeiculoCodigo and CnvDt(vendascartaoa.DATAVENDA,vendascartaoa.HORAVENDA) < CnvDt(vendascartao.DATAVENDA,vendascartao.HORAVENDA)), (select veiculos.KMInicial from veiculos where veiculos.codigo = vendascartao.veiculocodigo))) AS KMPercorrido,
    ifnull((select vendasdetalhamento.quantidade from vendasdetalhamento where vendasdetalhamento.VendaCodigo = vendascartao.VendaCodigo and vendasdetalhamento.ProdutoCod = (select veiculos.CombustivelCodigo from veiculos where veiculos.Codigo = vendascartao.VeiculoCodigo)), 0) AS LitrosAbst,
    ifnull(((VeiculoKM-ifnull((SELECT max(VeiculoKM) from vendascartao as vendascartaoa where vendascartaoa.VeiculoCodigo= vendascartao.VeiculoCodigo and CnvDt(vendascartaoa.DATAVENDA,vendascartaoa.HORAVENDA) < CnvDt(vendascartao.DATAVENDA,vendascartao.HORAVENDA)), (select veiculos.KMInicial from veiculos where veiculos.codigo = vendascartao.veiculocodigo))))/ifnull((select vendasdetalhamento.quantidade from vendasdetalhamento where vendasdetalhamento.VendaCodigo = vendascartao.VendaCodigo and vendasdetalhamento.ProdutoCod = (select veiculos.CombustivelCodigo from veiculos where veiculos.Codigo = vendascartao.VeiculoCodigo)), 0), 0) as MediaAtual
    FROM `vendascartao`

     

    Muito obrigado mesmo, de verdade.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!