Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas No Select Com If


Fernando Rutka

Pergunta

OLÁ GALERA,

SEGUINTE, ESTOU TENTANDO FAZER O SEGUINTE SELECT :

SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR,CodCliFornec 'CLI/FORN',

IF(CodCliFornec>=500000,

(SELECT RazaoSocial FROM PA0022 WHERE Codigo = M.CodCliFornec),

(SELECT RazaoSocial FROM PA0042 WHERE Codigo = M.CodCliFornec)) 'RAZAO SOCIAL',

FORMAT(preço,2) preço, FORMAT(CtMedPonderado,2) 'C.M.P.', FORMAT(QtMovimentada,3) QTD,

FORMAT(Saldo,3) SALDO

FROM PA0111 M WHERE Codigo = '$codigo' AND `NLocal` = '$local'

ONDE : >= 500000 BUSQUE NA TABELA PA0042 O NOME DO CLIENTE E CASO CONTRARIO BUSQUE NA TABELA PA0022

SO QUE ESSE SELECT SO ME RETORNO UM MALDITO ERRO DE SINTAXE :

"#1064 - Você tem um erro de sintaxe no seu SQL próximo a 'SELECT RazaoSocial FROM PA0042 WHERE Codigo = M.CodCliFornec)) CLI-FORN, FO"

alguém PODERIA DAR UMA FORCINHA AI ???

E SERA QUE DESSA FORMA É A MELHOR TAMBEM não é? ...

OBRIGADO DESDE JÁ!! ABRAÇOS

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
SO QUE ESSE SELECT SO ME RETORNO UM MALDITO ERRO DE SINTAXE :

"#1064 - Você tem um erro de sintaxe no seu SQL próximo a 'SELECT RazaoSocial FROM PA0042 WHERE Codigo = M.CodCliFornec)) CLI-FORN, FO"

alguém PODERIA DAR UMA FORCINHA AI ???

E SERA QUE DESSA FORMA É A MELHOR TAMBEM não é? ...

Oi, Fernando,

O erro retornado está relacionado ao uso de um select dentro do IF. O select externo não está endendendo estes dois outros selects dentro no lugar onde deveria haver somente o(s) atributo(s) da(s) tabela(s).

Sua solução passa por uma tebela temporária, já que o UNION também não se aplicaria a este caso.

As seguintes instruções devem ser seguidas na ordem abaixo:

CREATE TEMPORARY TABLE tmp
SELECT CodCliFornec, RazaoSocial FROM PA0022;
INSERT INTO tmp
SELECT CodCliFornec, RazaoSocial FROM PA0042;
SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR, M.CodCliFornec 'CLI/FORN', tmp.RazaoSocial 'RAZAO SOCIAL', FORMAT(preço,2) preço, FORMAT(CtMedPonderado,2) 'C.M.P.', FORMAT(QtMovimentada,3) QTD, 
FORMAT(Saldo,3) SALDO
FROM PA0111 M 
INNER JOIN TMP ON TMP.CodCliFornec = M.CodCliFornec
WHERE Codigo = '$codigo' AND `NLocal` = '$local';
DROP TABLE tmp;

Se não entender informe que explico melhor.

att

Denis Courcy

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

  • 0

VALEU DENIS, BRIGADO... MAS O SEGUINTE

FIZ O O CODIGO NA SEQUENCIA Q você MANDO :

CREATE TEMPORARY TABLE tmp

SELECT Codigo, RazaoSocial FROM PA0022;

INSERT INTO tmp

SELECT Codigo, RazaoSocial FROM PA0042;

SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR,

M.CodCliFornec 'CLI/FORN', tmp.RazaoSocial 'RAZAO SOCIAL',

FORMAT(preço,2) preço, FORMAT(CtMedPonderado,2) 'C.M.P.', FORMAT(QtMovimentada,3) QTD, FORMAT(Saldo,3) SALDO

FROM PA0111 M

INNER JOIN TMP ON TMP.Codigo = M.CodCliFornec

WHERE Codigo = 'AGAGIP SINT 24x1 1' AND NLocal = '1';

DROP TABLE tmp;

MAS O MYSQL RETORNA UM ERRO :

#1146 - Tabela 'sistema_alltrack.TMP' não existe

TENTEI FAZER UMA PARTE DE CADA VEZ, MAS TB DEU ERRO ...

OBRIGADO PELA AJUDA !

O DENIS ...ESKECE...DEU CERTO SIM, MAS DESSE JEITO AQ:

CREATE TEMPORARY TABLE TMP

SELECT Codigo CODCF, RazaoSocial FROM PA0022;

INSERT INTO TMP

SELECT Codigo, RazaoSocial FROM PA0042;

SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR,

M.CodCliFornec 'CLI/FORN', TMP.RazaoSocial 'RAZAO SOCIAL',

FORMAT(preço,2) preço, FORMAT(CtMedPonderado,2) 'C.M.P.', FORMAT(QtMovimentada,3) QTD, FORMAT(Saldo,3) SALDO

FROM PA0111 M

INNER JOIN TMP ON TMP.CODCF = M.CodCliFornec

WHERE Codigo = 'AGAGIP SINT 24x1 1' AND NLocal = '1';

VALEU VEIO !! OBRIGADO MESMO .... VAI SER DE GRANDE AJUDA AQ PRA MIM ...

Link para o comentário
Compartilhar em outros sites

  • 0
O DENIS ...ESKECE...DEU CERTO SIM, MAS DESSE JEITO AQ:

CREATE TEMPORARY TABLE TMP

SELECT Codigo CODCF, RazaoSocial FROM PA0022;

INSERT INTO TMP

SELECT Codigo, RazaoSocial FROM PA0042;

SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR,

M.CodCliFornec 'CLI/FORN', TMP.RazaoSocial 'RAZAO SOCIAL',

FORMAT(preço,2) preço, FORMAT(CtMedPonderado,2) 'C.M.P.', FORMAT(QtMovimentada,3) QTD, FORMAT(Saldo,3) SALDO

FROM PA0111 M

INNER JOIN TMP ON TMP.CODCF = M.CodCliFornec

WHERE Codigo = 'AGAGIP SINT 24x1 1' AND NLocal = '1';

VALEU VEIO !! OBRIGADO MESMO .... VAI SER DE GRANDE AJUDA AQ PRA MIM ...

Ok. Mas pense em uma solução melhor na organização de seu BD, pois este modo que fizemos tem um problema de performance que crescerá conforme crescer sua base de dados. Pois para a montagem da tabela temporária há a necessidade de varrer as outras duas tabelas.

att

Denis Courcy

Link para o comentário
Compartilhar em outros sites

  • 0

DENIS É POSSIVEL Q PELO phpMyAdmin FUNCIONAR O SCRIPT E POR EXEMPLO POR UM PG PHP NÃO ?

POIS CRIEI O SEGUINTE SCRIPT:

[font="Lucida Sans Unicode"]<html>
<head>
<link rel=stylesheet href="style.css" type="text/css"></head>
<style>
td  {background: #fff;}
</style>
</head>[/font]

[font="Lucida Sans Unicode"]<body style="padding: 0;">
<table border="1" cellspacing="0" width="100%" bordercolordark="white" bordercolorlight="black">
    <tr height="30" style="background-color: #EDEDED;">
        <td width="10%" bgcolor="#EDEDED" align="center" valign="middle">DATA</td>
        <td width="05%" bgcolor="#EDEDED" align="center" valign="middle">T.O.</td>
        <td width="10%" bgcolor="#EDEDED" align="left"   valign="middle">N.DOC.</td>
        <td width="05%" bgcolor="#EDEDED" align="center" valign="middle">TR.</td>
        <td width="05%" bgcolor="#EDEDED" align="left"   valign="middle">CODIGO</td>
  <td width="20%" bgcolor="#EDEDED" align="left"   valign="middle">CLIENTE/FORNECEDOR</td>
        <td width="10%" bgcolor="#EDEDED" align="right"  valign="middle">preço</td>
        <td width="10%" bgcolor="#EDEDED" align="right"  valign="middle">C.M.P.</td>
        <td width="10%" bgcolor="#EDEDED" align="right"  valign="middle">QTD.</td>
        <td width="05%" bgcolor="#EDEDED" align="center" valign="middle">T</td>
        <td width="10%" bgcolor="#EDEDED" align="right"  valign="middle">SALDO</td>
    </tr>
<?
 $codigo = $_REQUEST["codigo"];
 $empresa= $_REQUEST["empresa"];
 $local = $_REQUEST["local"]; 
 $con=mysql_connect("localhost","root","");
   mysql_select_db('sistema_'.$empresa,$con);
 $sql ='CREATE TEMPORARY TABLE TMP SELECT Codigo, RazaoSocial FROM PA0022;'
   .'INSERT INTO TMP SELECT Codigo, RazaoSocial FROM PA0042;'
   .'SELECT DATE_FORMAT(DtMovimento,\'%d/%m/%y\'), CodOperacao, NDocumento, Transacao, M.CodCliFornec, TMP.RazaoSocial,'
   .'FORMAT(preço,2), FORMAT(CtMedPonderado,2), FORMAT(QtMovimentada,3), FORMAT(Saldo,3)'
   .'FROM PA0111 M INNER JOIN TMP ON TMP.COdigo = M.CodCliFornec WHERE Codigo = \'$codigo\' AND NLocal = \'$local\' Order by Transacao asc;';
 $res=mysql_query($sql) or die ("erro na query ".mysql_error()); 
 $col=mysql_num_fields($res);
 $num=mysql_num_rows($res);
       /*  não USAR
        SELECT DATE_FORMAT(DtMovimento,'%d/%m/%y'),CodOperacao,NDocumento,Transacao,
        CodCliFornec,
        FORMAT(preço,2),FORMAT(CtMedPonderado,2),FORMAT(QtMovimentada,3),FORMAT(Saldo,3)
        from PA0111
        where codigo ='$codigo' and Nlocal = '$local' order by Transacao asc"; */[/font]

[font="Lucida Sans Unicode"] for ($linha=0;$linha<$num;$linha++){
  echo "<tr height=\"20\">";
   echo "<td align=\"center\" valign=\"bottom\">".mysql_result($res,$linha,0)/*DATA */."</td>";
   echo "<td align=\"center\" valign=\"bottom\">".mysql_result($res,$linha,1)/*COPER*/."</td>";
   echo "<td align=\"left\"   valign=\"bottom\">".mysql_result($res,$linha,2)/* N F */."</td>";
   echo "<td align=\"center\" valign=\"bottom\">".mysql_result($res,$linha,3)/* T R */."</td>";
   echo "<td align=\"left\"   valign=\"bottom\">".mysql_result($res,$linha,4)/* COD */."</td>";
   echo "<td align=\"right\"  valign=\"bottom\">".mysql_result($res,$linha,5)/*RAZAO*/."</td>";
   echo "<td align=\"right\"  valign=\"bottom\">".mysql_result($res,$linha,6)/* P R */."</td>";
   echo "<td align=\"right\"  valign=\"bottom\">".mysql_result($res,$linha,7)/*C M P*/."</td>";
   echo "<td align=\"right\"  valign=\"bottom\">".mysql_result($res,$linha,8)/* QTD */."</td>";
   echo "<td align=\"center\" valign=\"bottom\">";
   if (mysql_result($res,$linha,1) >= 50) /*  T  */
   {echo "S";}
   else
   {echo "E";}
   echo "</td>";
   echo "<td align=\"right\"  valign=\"bottom\">".mysql_result($res,$linha,9)/* SLD */."</td>";
  echo "</tr>";}
 $res=mysql_query('DROP TABLE TMP'); 
  
  ?>
</table>
</body>
</html>
[/font]

E PELA PG TAH ME RETONANDO UM ERRO :

erro na query Você tem um erro de sintaxe no seu SQL próximo a ';INSERT INTO TMP SELECT Codigo, RazaoSocial FROM PA0042;SELECT DATE_FORMAT(DtMov' na linha 1

O Q SERA Q PODE SER?

OBRIGADO

Editado por Fernando Rutka
Link para o comentário
Compartilhar em outros sites

  • 0
DENIS É POSSIVEL Q PELO phpMyAdmin FUNCIONAR O SCRIPT E POR EXEMPLO POR UM PG PHP NÃO ?

Sim. É possivel. Não Conheco o PHP ainda. Mas, no Delphi, você só pode passar uma instrução SQL por vez.

Tente passar uma instrução sql por vez. Se o PHP continuar chiando, crie uma tabela ioiô (temporária e física no banco de dados) somente para este tipo de ação.

att

Denis Courcy

Até amanhã.

Link para o comentário
Compartilhar em outros sites

  • 0
Uma Nova Solução

Oi Fernando,

Nada como uma boa noite de sono para melhorar os pensamentos.

Achei uma nova solução, mais inteligente que a primeira, pois não haverá a necessidade de usar uma tabela temporária e, conseqüentemente, diminuirá o tempo de processamento.

Esta solução passa pela criação de uma Stored Function (se é que podemos chamar assim).

Então vamos lá:

Criando a Função

delimiter $$
CREATE FUNCTION MinhaFuncao (cod_cliente CHAR(50)) RETURNS CHAR(50) DETERMINISTIC
BEGIN
   DECLARE MeuSQL CHAR(50);

   IF cod_cliente >= 500000
       SET MeuSQL  = ‘SELECT RazaoSocial FROM PA0022 WHERE Codigo = cod_cliente’;
   ELSE
       SET MeuSQL  = ‘SELECT RazaoSocial FROM PA0042 WHERE Codigo = cod_cliente’;
   END IF;
   
   PREPARE TESTE FROM @MeuSQL;
   EXECUTE TESTE;

   RETURN RazaoSocial;
END $$
Use a função assim:
SELECT DATE_FORMAT(DtMovimento, '%d/%m/%y') DATA, CodOperacao 'T.O.', NDocumento NF, Transacao TR,CodCliFornec 'CLI/FORN', MinhaFuncao(CodCliFornec) 'RAZAO SOCIAL',
FORMAT(preço, 2) preço, FORMAT(CtMedPonderado, 2) 'C.M.P.', FORMAT(QtMovimentada, 3) QTD, 
FORMAT(Saldo, 3) SALDO
FROM PA0111 M WHERE Codigo = '$codigo' AND `NLocal` = '$local';

Testa e informe o resultado.

att.

Denis Courcy

Link para o comentário
Compartilhar em outros sites

  • 0
MAS ESSA FUNÇÃO EU POSSO CRIAR ONDE DENIS ?

NO PROPRIO SQL ?

EXATAMENTE!!!!!

att Denis Courcy

P.S. Não esquece de testar, pois não tenho o MySQL aqui no trabalho e fiz esta função "de cabeça".

A explicação dela está no tópico "Carregando Variáveis Para Tratar No Where " aqui no forum. http://scriptbrasil.com.br/forum/index.php?showtopic=108429

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...