Gerar nº automaticamente

(gilmonteiro) #1

O meu sistema é uma base única onde cada empresa terá acesso separadamente. Em cada tabela consta o codigoempresa.
Na app emissão de orçamento preciso gerar automaticamente o nº do orçamento seqüencial para cada empresa. Ex. empresa x (nº 001 e 002…) e empresa Y (nº 001 e 002…)

Gostaria da ajude dos colegas.
Obg

Gilmar Monteiro

(Haroldo) #2

crie o campo nro_orcamento na tabela de empresas, e incremente a cada insert dos orçamentos.

(George Carvalho) #3

// PARA PEGAR O ULTIMO ORÇAMENTO DE DETERMINADA EMPRESA

sc_lookup(meusdados,“Select max(seq_orcamento)+1 from sua_tabela where empresa = ‘x’”);

if(false === {meusdados}){
sc_error_message(“Erro no acesso da tabela de XXXXXXXXXXXXX!” . {meusdados});
return;
}
if({meusdados[0][0]} == 0){
$orcamento = 1;
}else{
$orcamento={meusdados[0][0]};
}

(Haroldo) #4

Isso não é arriscado em mult-usuário?

(William .'.) #5

Extremamente arriscado … =-\

William

(George Carvalho) #6

É verdade, desculpa.

(George Carvalho) #7

E eu estou usando assim, com o alerta de vcs despertei para o problema, vou alterar minhas rotinas.

Obrigado

(George Carvalho) #8

Estava analisando a rotina e o que ela faz é a mesma coisa da sugerida por Haroldo, se ta pegando o maior seqüencial de determinada empresa qual a diferença para ser arriscado?

É a mesma coisa de ta pegando o último sequencial (orçamento) no cadastro da empresa.

Agora fiquei em duvida, onde esta o risco?

(Haroldo) #9

se dois usuários fizerem o insert ao mesmo tempo, ocorrerá erro.
com o campo controlado na tabela de empresas, você busca o número e incrementa tudo numa única instrução sql, durante o processo o travamento não permitirá a duplicação.
Pode ser díficil ocorrer uma inserção simultânea, ma não impossível, então por regras de programação voltada a uma concorrência mult-usuária, evitamos esse tipo de procedimento.

(gilmonteiro) #10

George;

Como sou aprendiz tanto na linguagem com no scriptcase.

Vão algumas dúvidas.

1 - Em que evento inserir?
2 - empresa = X (no meu caso a tabela esta como codigoempresa e o X seria a variável [var_codigoempresa] que pego ao se logar.
3 - sua_tabela (é a do orçamento ou da empresa)?

Obrg

Desculpa a ignorância

(George Carvalho) #11

Harold

Entendi, uso assim e hoje uma dos sistemas tem mais de 600 usuarios distintos (multi usuários) e graças a Deus não ocorreram erros. Vou analisar melhor para ver se altero.

Obrigado.

(George Carvalho) #12

Gilmar

1 - O evento pode ser no Onload;

2 - X seria a variável [var_codigoempresa];

3 - sua_tabela é a tabela que contem os sequencias dos orçamentos.

O script que postei pega o ultimo sequencial (orçamento) +1 da empresa definida como filtro na clasura Where.

Se não encontrar nenhum registro que atenda a condição é porque não existe orçamento para a empresa, então o número do orçamento vai ser 1.

E vc não tem porque pedir desculpas.

Boa sorte.

(gilmonteiro) #13

George;

Retonou o erro conforme o if abaixo, a tabela esta correta o campo tambem.

sc_lookup(meusdados,"Select max(n_orc)+1 from tb_orcamentos where codigoempresa = [var_codigoempresa]);

if(false === {meusdados}){
sc_error_message(“Erro no acesso da tabela de XXXXXXXXXXXXX!” . {meusdados});
return;
}
if({meusdados[0][0]} == 0){
$orcamento = 1;
}else{
$orcamento={meusdados[0][0]};
}

(George Carvalho) #14

Gilmar

Postei o sc_lookup faltando um " no final, substitua por esse.

sc_lookup(meusdados,“Select max(n_orc)+1 from tb_orcamentos where codigoempresa = ‘[var_codigoempresa]’”);

(gilmonteiro) #15

George

Agora não esta dando erro.

Mas não tive resultado,ao abrir o app a caixa de texto [nº Orc] era pra vim já o com o próximo numero, pois esta vazia.

Têm alguma coisa a ver com o tipo de dados na tabela ou no campo da app.

(George Carvalho) #16

Gilmar,

Se não achar registros o valor deveria retornar 1.

Mande para meu e-mail o script que vou criou.