Autor Tópico: (RESOLVIDO)Verificar registros antes de regravar  (Lida 2530 vezes)

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
(RESOLVIDO)Verificar registros antes de regravar
« Online: Dezembro 27, 2012, 09:47:15 am »
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.
Código: [Selecionar]
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);
}

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...
« Última modificação: Dezembro 28, 2012, 03:46:27 pm por Jean Matos »
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:Verificar registros antes de regravar
« Responder #1 Online: Dezembro 27, 2012, 10:53:21 am »
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.
-- Design ou programador eis a questão.

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Verificar registros antes de regravar
« Responder #2 Online: Dezembro 27, 2012, 04:53:33 pm »
Pense num sujeito que tá apanhando..

Código: [Selecionar]
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 ";
}

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!
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:Verificar registros antes de regravar
« Responder #3 Online: Dezembro 27, 2012, 04:59:46 pm »
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 .
-- Design ou programador eis a questão.

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Verificar registros antes de regravar
« Responder #4 Online: Dezembro 27, 2012, 05:58:53 pm »
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
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:Verificar registros antes de regravar
« Responder #5 Online: Dezembro 28, 2012, 07:50:40 am »
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
-- Design ou programador eis a questão.

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Verificar registros antes de regravar
« Responder #6 Online: Dezembro 28, 2012, 08:38:29 am »
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..
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:Verificar registros antes de regravar
« Responder #7 Online: Dezembro 28, 2012, 09:07:53 am »
RAPAAAAA esquece código pronto da NM...  A lógica da NM é distorcida. Final de 2012 = Final de 2013.  Osso.
-- Design ou programador eis a questão.

saulobborges

  • Expert
  • *****
  • Mensagens: 1392
    • SGi Sistemas
    • Email
Re:Verificar registros antes de regravar
« Responder #8 Online: Dezembro 28, 2012, 09:09:52 am »
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

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Verificar registros antes de regravar
« Responder #9 Online: Dezembro 28, 2012, 01:21:52 pm »
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 ?
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
(RESOLVIDO)Re:Verificar registros antes de regravar
« Responder #10 Online: Dezembro 28, 2012, 03:46:01 pm »
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.

Código: [Selecionar]
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
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:(RESOLVIDO)Verificar registros antes de regravar
« Responder #11 Online: Dezembro 28, 2012, 03:55:42 pm »
Nice! SQL orientado muito bom.
-- Design ou programador eis a questão.

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:(RESOLVIDO)Verificar registros antes de regravar
« Responder #12 Online: Dezembro 28, 2012, 03:58:22 pm »
Agora é só chamar ele dentro do SC.

Galera....bom fim de ano...to vazando
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:(RESOLVIDO)Verificar registros antes de regravar
« Responder #13 Online: Janeiro 02, 2013, 08:22:19 am »
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 ?
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:(RESOLVIDO)Verificar registros antes de regravar
« Responder #14 Online: Janeiro 02, 2013, 10:11:47 am »
Agora sim.. resolvido..

criei uma PROCEDURE interna no SqlServer e chamei ela no SC

sc_exec_sql("splistapreco");
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775