(RESOLVIDO)Verificar registros antes de regravar

Prezados, estou criando um sistema de cotação de insumos de obra e tenho o seguinte caso a resolver.

em um butom eu coloquei esse codigo que seleciona todos os itens do orçamento e gera uma outra tabela par fazer cotação.

[code]sc_lookup(dataset,“SELECT
CP,
valot_total,
idObra
FROM
dbo.View_lista_mat_servicos
WHERE
(idObra = ‘{idObra}’)”);

$conta = count({dataset});
for($x=0;$x<$conta;$x++)
{

		if({dataset}===false)
		{
				echo "Erro de acesso. Mensagem=" .{dataset};
		}elseif(empty({dataset}))
		{
				echo "Comando Select não retornou dados";
		}else
		{	

$CP = {dataset[$x][0]};
$valot_total = {dataset[$x][1]};
$idObra = {dataset[$x][2]};

/**

  • Insert a record on another table
    */
    // SQL statement parameters
    $insert_table = ‘cotacao_planilha’; // Table name
    $insert_fields = array( // Field list, add as many as needed
    ‘componente’ => “’$CP’”,
    ‘quantidade’ => “’$valot_total’”,
    ‘obra’ => “’$idObra’”,

);
}
// Insert record
$insert_sql = ‘INSERT INTO ’ . $insert_table
. ’ (’ . implode(’, ‘, array_keys($insert_fields)) . ‘)’
. ’ VALUES (’ . implode(’, ', array_values($insert_fields)) . ‘)’;

sc_exec_sql($insert_sql);
}
[/code]

até aqui tudo bem… tá funcionando.

Agora preciso prever que apos estar tudo pronto e posso adicionar mais itens nessa planilha, logo terei que adicionar esses itens na cotação.

como faço para nao duplicar registro? isto é, deve gravar apenas o item que nao tem…

Coloque a chave em um array e antes de inserir verifique esse array com os registros já existentes.

Ai só mande gravar quando não existir registros.

Pense num sujeito que tá apanhando…

[code]sc_lookup(dataset,“SELECT
CP,
idObra
FROM
dbo.View_lista_mat_servicos
WHERE
(idObra = ‘{idObra}’)”);

$conta = count({dataset});
for($x=0;$x<$conta;$x++){
$cp = {dataset[$x][0]};

}
// SQL statement parameters
$check_table = ‘cotacao_planilha’; // Table name
$check_where = “componente = ‘$cp’”; // Where clause

// Check for record
$check_sql = ‘SELECT *’
. ’ FROM ’ . $check_table
. ’ WHERE ’ . $check_where;
sc_select(dataset, $check_sql);

if (false == {dataset})
{
echo “erro de acesso”;
}
elseif ({dataset}->EOF)
{
echo "nao retornou ";
}
else
{
echo "retornou ";
}
[/code]

Estou tentando fazer essa verificação, no entanto apenas retorna o ultimo echo “retornou”… como faço pra saber se ele esta verificando um por um ?

HELP!

Feche o FOR no final do código.

Você deixou o for de fora da verificação.

Ai ele passa pelo for todo e a sua variável só fica com o ultimo valor. Você tem que fazer a variável receber o valor, verificar esse valor, ai voltar no for fazer a variável receber o segundo valor, verificar, e assim substantivamente .

Modifiquei e olha o que dá –

retornou
Fatal error: Cannot use object of type ADORecordSet_array_mssqlnative as array in C:\Program Files (x86)\NetMake\v6\wwwroot\scriptcase\app\MAM_Gestao_ISO_PBQPH\PlanilhaOrcamentoTCPO\PlanilhaOrcamentoTCPO_apl.php on line 1228

lol…

É difícil resolver assim Jean, a lógica é essa.

SELECT DA VERIFICAÇÃO

COUNT DO RETORNO

FOR BASEADO NO COUNT
INICIA FOR

VERIFICAÇÃO EM X

INSERÇÃO SE X VERDADEIRO

FIM DO FOR

rapá…depois de 5 dias na birita de natal e fim de ano… os neurônios tão se enrolando com um simples FOR…
Mas acho que é por conta dos 2 barril de chopp desse fim de semana próximo me aguardando. Tico e Teco já entrou em Loop…

vou apagar tudo e refazer…

mas… pelo que percebi a lógica que eu estou usando esta errada… eu estava usando um codigo pronto da NM e suspeitei desde o principio que tinha algo estranho…

assim que funfar eu posto aqui…

RAPAAAAA esquece código pronto da NM… A lógica da NM é distorcida. Final de 2012 = Final de 2013. Osso.

kkkkkkkkkkkkkkkkkkkkkk…lógica distorcida foi soda…!!! kkkkkkkkkk

gente… vou explicar novamente.

o sistema funciona assim:
1º - ele pega uma lista de produtos em uma tabela e lança em outra.
2º - pode ocorrer de eu adicionar mais produtos na primeira tabela, e consequentemente preciso adicionar esses produtos na segunda tabela… sem duplicar os demais existentes.
3º pode ocorrer e eu ter que adicionar mais produtos e retirar outros na primeira tabela e entao atualizar a segunda…
4º -eu nao posso deletar os dados da segunda e reinserir tudo(o que seria facil) porque na segunda tabela eu tenho outros campos que eu atualizei… tipo — cotei o valor dos produtos… logo nao vou apagar e refazer…

5º - estou quase voltando a vender picole pq isso tá osso…

alguem se habilita a me dar o caminho das pedras ?

Prezados… segue a solução. ESTA A NIVEL DE BANCO DE DADOS SQLSERVER 2008

esse codigo SQL insere, atualiza e deleta ao mesmo tempo.

detalhe . além de comparar o produto tenho que comparar em qual planilha ele está… caso contrario ele vai entender que só existe 1 produto de cada para todas.

MERGE dbo.cotacao_planilha AS C //planilha destino USING dbo.View_lista_mat_servicos AS L //planilha ou view origem ON (C.componente=L.CP AND L.idorcamentotcpo=C.idorcamentotcpo) // condição WHEN MATCHED AND C.componente <> L.CP OR C.obra <> L.idObra OR C.idorcamentotcpo <> L.idorcamentotcpo THEN UPDATE SET C.componente = L.CP WHEN NOT MATCHED THEN INSERT (componente,Obra,idorcamentotcpo) VALUES (L.CP,L.idObra,L.idorcamentotcpo) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, inserted.componente AS ID, inserted.idorcamentotcpo AS TC, deleted.componente AS TargID, deleted.idorcamentotcpo AS DTC;

Link de onde tirei a informação. http://msdn.microsoft.com/pt-br/library/bb522522(v=sql.105).aspx

Nice! SQL orientado muito bom.

Agora é só chamar ele dentro do SC.

Galera…bom fim de ano…to vazando

Quase resolvido…
Deu zica na hora de chamar dentro do SC…

parece que o $action esta dando zebra… pois o SC entende que é uma Variável… logo nao executar vazia… acho…

alguem sabe como executo esse procedimento dentro do SC ?

Agora sim… resolvido…

criei uma PROCEDURE interna no SqlServer e chamei ela no SC

sc_exec_sql(“splistapreco”);