[RESOLVIDO] Aparecer nome com sc_lookup

Boa tarde,

Precisava da vossa ajuda para o seguinte:

  • tenho 2 tabelas (Diligencias;Fichasinali) que estão ligadas por chave estrangeira
  • preciso que na tabela Diligencias apareça o nome que está em outra tabela (Idoso) e que não tem chave estrangeira com Diligencias, mas sim com Fichasinali.

Criei o seguinte código com SQL:


/* Macro sc_lookup /
$sql ="
SELECT
fichasinali.id_ficha,
idoso.id_idoso,
idoso.nome,
gerirdeligencias.fichasinali_id_ficha,
gerirdeligencias.id_deligencias
FROM
gerirdeligencias,
fichasinali LEFT OUTER JOIN idoso ON fichasinali.idoso_id_idoso = idoso.id_idoso
WHERE
gerirdeligencias.id_deligencias= {fichasinali.id_ficha }
";
sc_lookup(gerirdeligencias, $sql);
/
Erro no lookup /
if (FALSE === {gerirdeligencias}) {
sc_error_message(“Ocorreu um erro no acesso ao banco de dados.”);
}
elseif (empty({gerirdeligencias})) { /
EOF /
// CONTINUA…
}
else {
/
Inclua aqui sua rotina de processamento */
{idosonome} = {gerirdeligencias[0][2]}; // << Veja se o nome do campo que vai receber o valor é {idosonome}
}


Criei ainda um campo label (idosonome).
Com este código aparece o nome do idoso, mas o problema é que aparece sempre o mesmo nome quando devia mudar se a diligência está associada a outra Ficha de sinalização.

O que estou a fazer mal?

gerirdeligencias.id_deligencias= {fichasinali.id_ficha}

O Problema esta aqui:
{fichasinali.id_ficha} de onde esta vindo esta campo? você criou um Formulário ou Consulta?

Esse {fichasinali.id_ficha} é um campo da tabela fichasinali. Ou seja uma diligencia está associada a uma ficha de sinalização. E uma ficha de sinalização está associada a um Idoso.
Já tentei também no WHERE fazer: gerirdeligencias.id_deligencias= {fichasinali.idoso_id_idoso} (que é chave estrangeira na tabela Fichasinali) mas dá erro.
É um campo de um formulário.
Esse código foi você que me passou Jailton em outra dúvida que tive. E agora mudei para este sc_lookup que precisava fazer.

Mas a aplicação que você esta fazendo usando agora é GRID ou formulário? se for formulário não existe isso: {fichasinali.id_ficha} teria que ser {id_ficha}.

Sim a aplicação é Grid.

Se a aplicação é GRID, copia e cola aqui o SQL principal desta GRID é possível já adaptar isso no SQL da consulta principal e não precisar usar o sc_lookup no onRecord.

Jailton esse é o sql da grid:

SELECT
fichasinali.id_ficha,
fichasinali.idoso_id_idoso,
gerirdeligencias.id_deligencias
FROM
fichasinali LEFT OUTER JOIN gerirdeligencias ON fichasinali.id_ficha = gerirdeligencias.fichasinali_id_ficha
WHERE
(gerirdeligencias.id_deligencias>“0”)
ORDER BY
fichasinali.idoso_id_idoso

Mas estava a esquecer de uma coisa. Essa grid serve para dar o resultado do count de diligencias por idoso, mas depois criei uma ligação de aplicação para o formulário Diligencias. E é aí que deve aparecer o nome do Idoso o que não está a acontecer.
Será que nesse Formulário eu posso colocar uma clausula Where?

No formulário de Diligencias, coloque no sc_lookup:

/* Macro sc_lookup /
$sql ="
SELECT
fichasinali.id_ficha,
idoso.id_idoso,
idoso.nome,
gerirdeligencias.fichasinali_id_ficha,
gerirdeligencias.id_deligencias
FROM
gerirdeligencias,
fichasinali LEFT OUTER JOIN idoso ON fichasinali.idoso_id_idoso = idoso.id_idoso
WHERE
gerirdeligencias.id_deligencias= [glo_id_ficha]
";
sc_lookup(idos, $sql); // Variável array de pesquisa use no mínimo 4 caracteres, não use nome de tabelas ou campos, ou palavras do PHP, SC.
/
Erro no lookup /
if (FALSE === {idos}) {
sc_error_message(“Ocorreu um erro no acesso ao banco de dados.”);
}
elseif (empty({idos})) { /
EOF /
// CONTINUA…
}
else {
/
Inclua aqui sua rotina de processamento */
{idosonome} = {idos[0][2]}; // << Veja se o nome do campo que vai receber o valor é {idosonome}
}

Refaça a ligação da consulta novamente para o formulário Diligencias você vai ver que vai aparecer a variável: [glo_id_ficha] relacione o valor dela à: {fichasinali.id_ficha} que esta na consulta,
pronto gerar os códigos novamente da consulta e formulário e executar a consulta para testar.

Jailton obrigada pela ajuda.
Mas não está a funcionar. O problema é que é sempre o mesmo nome que aparece. Ele não muda o nome da pessoa que está ligada por exemplo à Diligencia nº 13. Mantém sempre o nome da pessoa que está ligada à Diligencia nº 1.
O nº da ficha muda, mas o nome da pessoa não.
Não sei porque não está a funcionar.

Provavelmente a tua variável [glo_id_ficha] não está mudando de acordo com a diligência escolhida.

Copia esse código do sc_lookup e guarda ele em um arquivo texto e salva.

Agora troca ele por:
echo ‘Estou recebendo o valor id_ficha =’.[glo_id_ficha]."
";

break;

E refaz o teste, lembre-se de na consulta refazer a ligação e relacionar o: [glo_id_ficha] = {fichasinali.id_ficha}, ai gera todas app e testa.

Jailton refiz o código como diz aqui. Ele dá o echo bem. Mas penso que o meu problema não é esse.
Ele vai buscar a ficha certa o problema é que não muda o nome associado a essa ficha e fica sempre o nome associado à ficha 1. POr exemplo se faço editar na pessoa que tem a ficha 2 devia aparecer o nome da pessoa 2. E é isso que ele não esta a fazer.
O problema não é com a ficha mas com o nome .

Consegui Jailton!
Fiz tudo diferente. Pensei se na Grid e se na consulta aparece o nome do Idoso por que não usar o SQL dessa consulta.
Foi o que fiz:
$sql ="
SELECT
fichasinali.id_ficha,
fichasinali.idoso_id_idoso,
gerirdeligencias.id_deligencias
FROM
fichasinali LEFT OUTER JOIN gerirdeligencias ON fichasinali.id_ficha = gerirdeligencias.fichasinali_id_ficha
WHERE
gerirdeligencias.id_deligencias={fichasinali.id_ficha}
ORDER BY
fichasinali.idoso_id_idoso
";
sc_lookup(idos, $sql); // Variável array de pesquisa use no mínimo 4 caracteres, não use nome de tabelas ou campos, ou palavras do PHP, SC.
/* Erro no lookup /
if (FALSE === {idos}) {
sc_error_message(“Ocorreu um erro no acesso ao banco de dados.”);
}
elseif (empty({idos})) { /
EOF /
// CONTINUA…
}
else {
/
Inclua aqui sua rotina de processamento */
{idosonome} = {idos[0][2]}; // << Veja se o nome do campo que vai receber o valor é {idosonome}
}

Ou seja, não criei um novo SQL como tinha feito e parti do próprio sql da grid. Depois usei o método PHP como está acrescentado a sua instrução para passar no campo {idosonome}.
Depois bastou na ligação dizer que o campo id_deligencias era deligencias.id_deligencias.
Acho que eu estava a complicar tendo criado outro sql.
Obrigada pela sua ajuda sempre preciosa que me ajuda a pensar!

Jailton,

Estava a tentar fazer o seguinte:
$sql ="
SELECT
fichasinali.id_ficha,
fichasinali.idoso_id_idoso,
gerirdeliberacoes.id_deliberacoes
FROM
fichasinali LEFT OUTER JOIN gerirdeliberacoes ON fichasinali.id_ficha = gerirdeliberacoes.fichasinali_id_ficha
WHERE
gerirdeliberacoes.id_deliberacoes={fichasinali.id_ficha}
ORDER BY
fichasinali.idoso_id_idoso
";
sc_lookup(idos, $sql); // Variável array de pesquisa use no mínimo 4 caracteres, não use nome de tabelas ou campos, ou palavras do PHP, SC.
/* Erro no lookup /
if (FALSE === {idos}) {
sc_error_message(“Ocorreu um erro no acesso ao banco de dados.”);
}
elseif (empty({idos})) { /
EOF /
// CONTINUA…
}
else {
/
Inclua aqui sua rotina de processamento */
{nomeidoso} = {idos[0][2]}; // << Veja se o nome do campo que vai receber o valor é {idosonome}
}


Mas com outra tabela e a mesma instruções com que eu tinha conseguido agora não está a funcionar para esta tabela.
O que será que estou a fazer de errado?
Já tentei também usar esta instrução no SQL Builder e dá sempre erro de mysql: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘} ORDER BY fichasinali.idoso_id_idoso LIMIT 0,11’ at line 8 ".
Obrigada

Este campo esta faltando: ={fichasinali.id_ficha}, veja se ele existe ele pode estar só como: {id_ficha}

O campo existe sim. Copiei todo o código que já tinha dado certo com a outra explicação que você me deu e que dava certo. Depois só alterei os nomes dos campos da nova tabela. E esse campo {fichasinali.id_ficha} mantém-se o mesmo que estava. Também já experimentei escrevendo o campo como está na tabela gerirdeliberacoes e como chave estrangeira - {fichasinali_id_ficha}. E não funciona.
Quando vou no SQL builder e escrevo:
SELECT
fichasinali.id_ficha
fichasinali.idoso_id_idoso
gerirdeliberacoes.id_deliberacoes
FROM
fichasinali LEFT OUTER JOIN gerirdeliberacoes ON fichasinali.id_ficha = gerirdeliberacoes.fichasinali_id_ficha
WHERE
gerirdeliberacoes.id_deliberacoes={fichasinali.id_ficha}
ORDER BY
fichasinali.idoso_id_idoso

Dá sempre erro de syntax por causa da versão do servidor e da syntax que se escreve junto ao '}.
Não sei o que pode estar a acontecer.

Guarda todo esse código em um arquivo texto, salva, e testa com este código:
$sql ="
SELECT
fichasinali.id_ficha,
fichasinali.idoso_id_idoso,
gerirdeliberacoes.id_deliberacoes
FROM
fichasinali LEFT OUTER JOIN gerirdeliberacoes ON fichasinali.id_ficha = gerirdeliberacoes.fichasinali_id_ficha
WHERE
gerirdeliberacoes.id_deliberacoes={fichasinali.id_ficha}
ORDER BY
fichasinali.idoso_id_idoso
";

echo 'SQL = '.$sql."
";

break;

Veja o como esta sendo montado para você poder descobrir se falta algo.

Jailton obrigada!
Deu este erro: SQL = SELECT fichasinali.id_ficha, fichasinali.idoso_id_idoso, gerirdeliberacoes.id_deliberacoes FROM fichasinali LEFT OUTER JOIN gerirdeliberacoes ON fichasinali.id_ficha = gerirdeliberacoes.fichasinali_id_ficha WHERE gerirdeliberacoes.id_deliberacoes=3 ORDER BY fichasinali.idoso_id_idoso
Fatal error: Cannot break/continue 1 level in C:\Program Files (x86)\NetMake\v81\wwwroot\scriptcase\app\caip_maio\formulario_gerirdeliberacoes_principal\formulario_gerirdeliberacoes_principal_apl.php on line 3549

Colei o seu código no formulário no método php.
Tirei o break; e aparece o código em cima e o formulário em baixo. Ele vai buscar a ficha certa, mas não me aparece o nome do idoso.

Fatal error: Cannot break não é erro é o comando: break; que faz a parada, para você poder analisar o código.

Bom ele gerou a SQL:
SELECT fichasinali.id_ficha, fichasinali.idoso_id_idoso, gerirdeliberacoes.id_deliberacoes FROM fichasinali LEFT OUTER JOIN gerirdeliberacoes ON fichasinali.id_ficha = gerirdeliberacoes.fichasinali_id_ficha WHERE gerirdeliberacoes.id_deliberacoes=3 ORDER BY fichasinali.idoso_id_idoso

Pega essas SQL agora e passa no SQL BUILDER > Executar ou no gerenciador padrão que você usa para gerenciar a base e veja se vai dar erro.

Vanda o Modo Debug mostra a execução do SQL, cole aqui a execução do SQL.