Problema de Atualização do Detalhe para Mestre

(Leosc) #1

Estou tendo um problema com o mestre / detalhe. Eu tenho uma aplicacao que faz um processamente parecido com o exemplo mestre detalhe que vem no sc4. Eu criei um metodo que da um sum num campo do detalhe, e atualiza o total dele no mestre. Ai chamo ele no after insert, update e delete. Nos insert e update funciona blz, mas no delete acontece um comportamento estranho que tambem acontece no exemplo de mestre detalhe pedido/itens que vem no sc4. Enquanto vc tem por exemplo mais de um item, a atualizacao ocorre blz, mas quando vc ja apagou todos e esta no ultimo, na hora que vc clica no icone da lixeira o registro nao some, nao da nenhuma mensagem de erro. Rodei com o debug. No caso de ter 3 itens de pedido, ele da 2 delete nos dois primeiros itens, + 2 updates no mestre, e nao mostra nada pro ultimo registro. Mas quando a gente navega pro proximo e volta, o ultimo registro some. Facam o teste e voces verão que trem mais estranho. Entao o saldo do mestre fica errado, porque no ultimo registro da o pau e o mestre não é atualizado. Ai é duro ! No exemplo eles mandam colocar o atualiza_mestre para os 3 eventos, e o proprio exemplo deles da pau. Ai pergundo ? eles ensinaram errado ou a ferramenta ta com erro ? Como resolver este impasse ?

(Leosc) #2

Consegui resolver o problema. Sinceramente acho uma vergonha a empresa colocar um exemplo pro mundo inteiro da ferramenta, codificado errado. Isto queima o nome da empresa. Após fazer as modificacoes abaixo a delecao do ultimo registro funcionou corretamente.
2 observacoes: 1 Tive que tratar o retorno do select sum , porque quando apaga o ultimo registro filho vai voltar um resultset vazio. 2) tive que colocar a sc_format_num, porque no ultimo registro dava algum pau na funcao sc_master_value, entao com esta funcao antes resolveu. Porque nao sei…vai entender ne !

sc_lookup(dataset,“SELECT SUM(Total) FROM adm_pedido_itens
WHERE (PedidoID = ‘{PedidoID}’)”);
if (empty({dataset}[0][0])) {
$total = 0.0;
} else {
$total = {dataset}[0][0];
}
sc_exec_sql(‘UPDATE adm_pedidos SET ValorPedido = $total WHERE PedidoID = {PedidoID}’);
sc_format_num($total, ‘.’, ‘,’, 2, ‘S’, ‘1’, ‘’);
sc_master_value(‘ValorPedido’,$total);

(rayfcrols) #3

Olá, eu também estou com uma aplicação mestre/detalhe em que não consigo de maneira alguma atualizar um campo do mestre/pai.
Adicionando que no BD é MSSQL “SQL Server” e o campo esta como “money” e na aplicação esta com “Numero” e exibição tipo “Label”.

Eis o codigo da função que esta sendo chamada nos evanto after(Insert,Updade,Delete):

sc_lookup(dataset,“SELECT SUM(prolabore_prof) FROM dbo.tb_lancamentos_prof WHERE (num_lanc = ‘{num_lanc}’)”);
if (empty({dataset}[0][0])) {
$total = 0.0;
} else {
$total = {dataset}[0][0];
}
sc_exec_sql("
UPDATE
dbo.tb_lancamentos
SET
val_tot_lanc = $total
WHERE
num_lanc = {num_lanc}
");
sc_format_num($total, ‘.’, ‘,’, 2, ‘S’, ‘1’, ‘’);
sc_master_value(‘val_tot_lanc’,$total);