Atualize hoje para o Scriptcase 9 e ganhe 35% de desconto! Atualize hoje para o Scriptcase 9 e ganhe 35% de desconto! COMPRAR AGORA!

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

Jean Matos

  • Expert
  • *****
  • Mensagens: 985
    • 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 »
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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!
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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..
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 1406
    • 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: 985
    • 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 ?
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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 ?
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 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: 985
    • 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");
V8.1, V9
Windows Server 2012 Enterpriser 64 bits
SqlServer 2012 datacenter 64 bits
Sistema Integrado de Gestão de Construtoras WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775