Fernando Rutka Postado Outubro 25, 2007 Denunciar Share Postado Outubro 25, 2007 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) SALDOFROM PA0111 M WHERE Codigo = '$codigo' AND `NLocal` = '$local'ONDE : >= 500000 BUSQUE NA TABELA PA0042 O NOME DO CLIENTE E CASO CONTRARIO BUSQUE NA TABELA PA0022SO 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 More sharing options...
0 Denis Courcy Postado Outubro 25, 2007 Denunciar Share Postado Outubro 25, 2007 (editado) 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.attDenis Courcy Editado Outubro 25, 2007 por Denis Courcy Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Rutka Postado Outubro 25, 2007 Autor Denunciar Share Postado Outubro 25, 2007 VALEU DENIS, BRIGADO... MAS O SEGUINTEFIZ O O CODIGO NA SEQUENCIA Q você MANDO :CREATE TEMPORARY TABLE tmpSELECT Codigo, RazaoSocial FROM PA0022;INSERT INTO tmpSELECT 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) SALDOFROM PA0111 M INNER JOIN TMP ON TMP.Codigo = M.CodCliFornecWHERE 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 TMPSELECT Codigo CODCF, RazaoSocial FROM PA0022;INSERT INTO TMPSELECT 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) SALDOFROM PA0111 M INNER JOIN TMP ON TMP.CODCF = M.CodCliFornecWHERE 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 More sharing options...
0 Denis Courcy Postado Outubro 25, 2007 Denunciar Share Postado Outubro 25, 2007 O DENIS ...ESKECE...DEU CERTO SIM, MAS DESSE JEITO AQ:CREATE TEMPORARY TABLE TMPSELECT Codigo CODCF, RazaoSocial FROM PA0022;INSERT INTO TMPSELECT 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) SALDOFROM PA0111 M INNER JOIN TMP ON TMP.CODCF = M.CodCliFornecWHERE 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.attDenis Courcy Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Rutka Postado Outubro 25, 2007 Autor Denunciar Share Postado Outubro 25, 2007 (editado) 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 1O Q SERA Q PODE SER?OBRIGADO Editado Outubro 25, 2007 por Fernando Rutka Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Outubro 25, 2007 Denunciar Share Postado Outubro 25, 2007 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 CourcyAté amanhã. Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Outubro 26, 2007 Denunciar Share Postado Outubro 26, 2007 Uma Nova SoluçãoOi 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çãodelimiter $$ 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 More sharing options...
0 Fernando Rutka Postado Outubro 26, 2007 Autor Denunciar Share Postado Outubro 26, 2007 MAS ESSA FUNÇÃO EU POSSO CRIAR ONDE DENIS ?NO PROPRIO SQL ? Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Outubro 26, 2007 Denunciar Share Postado Outubro 26, 2007 (editado) MAS ESSA FUNÇÃO EU POSSO CRIAR ONDE DENIS ?NO PROPRIO SQL ?EXATAMENTE!!!!!att Denis CourcyP.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 Outubro 26, 2007 por Denis Courcy Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Fernando Rutka
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