Re: [pgbr-geral] Funcão PostgreSQL 9.2
Apenas um UPDATE. Com o código à cima, IF (TG_OP = 'INSERT') THEN > UPDATE public.companies SET client_code_increment = > (client_code_increment + 1) WHERE id = NEW.company_id; Mesmo que o usuário não incluísse data, ele atualizava para o próximo valor. Isto estava errado. Segue a correção: IF (TG_OP = 'INSERT') AND NEW.code IS NULL THEN > UPDATE public.companies SET client_code_increment = > (client_code_increment + 1) WHERE id = NEW.company_id; Obrigado. Lucas ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Só para deixar registrado.. consegui fazer funcionar, segue código para futuras pesquisas: ALTER TABLE public.companies ADD COLUMN client_code_increment integer; > ALTER TABLE public.companies ALTER COLUMN client_code_increment SET NOT > NULL; > ALTER TABLE public.companies ALTER COLUMN client_code_increment SET > DEFAULT 1000; > COMMIT TRANSACTION; > > BEGIN; > -- Creating the function > CREATE OR REPLACE FUNCTION users_code_seq() >RETURNS "trigger" AS $$ > DECLARE code character varying; > BEGIN > -- if it's an insert, then we update the client_code_increment column > value to +1 > IF (TG_OP = 'INSERT') THEN > UPDATE public.companies SET client_code_increment = > (client_code_increment + 1) WHERE id = NEW.company_id; > END IF; > -- IF the customer didn't provide a code value, we insert the next > available from companies.client_code_increment > IF NEW.code IS NULL THEN > SELECT client_code_increment INTO NEW.code FROM public.companies > as c WHERE c.id = NEW.company_id ORDER BY client_code_increment DESC; > END IF; > RETURN NEW; > END; > $$ LANGUAGE plpgsql; > -- Creating the trigger > CREATE TRIGGER tf_users_code_seq >BEFORE INSERT >ON public.users >FOR EACH ROW >EXECUTE PROCEDURE users_code_seq(); > > COMMIT TRANSACTION; ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Estou tendo problemas para adequar a function ao que eu preciso: INSERT INTO public.users > (id,email,encrypted_password,sign_in_count,created_at,updated_at,company_id) > VALUES (66,'tes...@test.com','password','0','2016-05-03 > 00:01:01','2016-05-03 00:01:01','15'); - Note como eu não estou fornecendo dados para a coluna "code". Recebo o erro em seguida. > ERROR: query returned no rows > CONTEXT: PL/pgSQL function users_code_seq() line 7 at SQL statement - Se eu incluir o valor como default, recebo o mesmo erro > INSERT INTO public.users > (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id) > VALUES (4,'te...@test.com','password','0','2016-05-03 > 00:01:01','2016-05-03 00:01:01',default,'2'); I get the same error - Por favor, se alguém puder ajudar com isto... não sei onde estou errando... *Como estou fazendo meus tests?:* *1 -* CREATE OR REPLACE FUNCTION users_code_seq() >RETURNS "trigger" AS $$ > DECLARE code character varying; > BEGIN > IF NEW.code IS NULL THEN > SELECT client_code_increment INTO STRICT NEW.code FROM > public.companies WHERE id = NEW.id ORDER BY client_code_increment DESC; > END IF; > IF (TG_OP = 'INSERT') THEN > UPDATE public.companies SET client_code_increment = > (client_code_increment + 1) WHERE id = NEW.id; > END IF; > RETURN NEW; > END; > $$ LANGUAGE plpgsql; *2 - * *companies.client_code_increment:* ALTER TABLE public.companies ADD COLUMN client_code_increment integer; > ALTER TABLE public.companies ALTER COLUMN client_code_increment SET NOT > NULL; > ALTER TABLE public.companies ALTER COLUMN client_code_increment SET > DEFAULT 1000; *3 - * *Trigger:* > CREATE TRIGGER tf_users_code_seq >BEFORE INSERT >ON public.users >FOR EACH ROW >EXECUTE PROCEDURE users_code_seq(); *4 - Insert dentro da tabela companies, para cadastrar duas empresas:* > INSERT INTO > public.companies(id,name,created_at,updated_at,client_code_increment) > VALUES (1,'Company 1','2016-05-03 00:01:01','2016-05-03 00:01:01',default); > - *PASS* > INSERT INTO > public.companies(id,name,created_at,updated_at,client_code_increment) > VALUES (2,'Company 2','2016-05-03 00:01:01','2016-05-03 > 00:01:01',default); *- PASS* *5 - insert dentro da tabela users, para cadastrar os usuários:* > INSERT INTO public.users > (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id) > VALUES (1,'te...@test.com','password','0','2016-05-03 > 00:01:01','2016-05-03 00:01:01','default','2'); - > *PASS*INSERT INTO public.users > (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id) > VALUES (2,'te...@test.com','password','0','2016-05-03 > 00:01:01','2016-05-03 00:01:01',default,'1'); - > *NO PASS*INSERT INTO public.users > (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id) > VALUES (3,'te...@test.com','password','0','2016-05-03 > 00:01:01','2016-05-03 00:01:01',default,'2'); - *NO PASS* Se alguém puder ajudar... obrigado. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
hmm.. Conseguir fazer funcionar, da seguinte maneira: CREATE OR REPLACE FUNCTION users_code_seq() >RETURNS "trigger" AS $$ > BEGIN > > IF (TG_OP = 'INSERT') THEN > UPDATE public.company_seqs SET last_seq = (last_seq + 1) WHERE > company_id = NEW.company_id; > > END IF; > > IF NEW.code IS NULL THEN > SELECT last_seq INTO NEW.code FROM public.company_seqs WHERE > company_id = NEW.company_id ORDER BY last_seq DESC; > > END IF; > > RETURN NEW; > > END; > $$ LANGUAGE plpgsql; Eu estava fazendo o ELSEIF errado.. Obrigado ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
> > CREATE OR REPLACE FUNCTION users_code_seq() >RETURNS "trigger" AS $$ > --DECLARE > --code character varying; > BEGIN > IF (TG_OP = 'INSERT') THEN > UPDATE public.company_seqs SET last_seq = (last_seq + 1) WHERE > company_id = NEW.company_id; > > ELSEIF NEW.code IS NULL THEN > SELECT last_seq INTO NEW.code FROM public.company_seqs WHERE > company_id = NEW.company_id; > > END IF; > > RETURN new; > > END; > $$ LANGUAGE plpgsql; Então... Caso o users.code seja nullo (pois o usuário não inseriu dado nela), seleciona a última seq válida da tabela company_seqs e bota dentro da users.code. Mas essa parte não está funcionando... No que eu estou errando? Obrigado! ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Só atualizando a function tf_users_update_code_column.. Incluido o campo *AND NEW.code IS NULL , *para que o usuário possa incluir o valor que quiser, e caso ele não inclua, a funcao insere os dados necessário. - Tinha esquecido dessa parte antes, por isto decidi postar todo o código aqui novamente, para que fique melhor de entender. IF NEW.company_id = 1 AND NEW.code IS NULL THEN > NEW.code = NEXTVAL('c1_users_code_seq'); CODE: 1 - creating the trigger FUNCTION CREATE OR REPLACE FUNCTION tf_users_update_code_column() RETURNS trigger AS $$ BEGIN IF NEW.company_id = 1 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c1_users_code_seq'); ELSEIF NEW.company_id = 2 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c2_users_code_seq'); ELSEIF NEW.company_id = 3 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c3_users_code_seq'); ELSEIF NEW.company_id = 4 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c4_users_code_seq'); ELSEIF NEW.company_id = 5 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c5_users_code_seq'); ELSEIF NEW.company_id = 6 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c6_users_code_seq'); ELSEIF NEW.company_id = 7 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c7_users_code_seq'); ELSEIF NEW.company_id = 8 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c8_users_code_seq'); ELSEIF NEW.company_id = 9 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c9_users_code_seq'); ELSEIF NEW.company_id = 10 AND NEW.code IS NULL THEN NEW.code = NEXTVAL('c10_users_code_seq'); END IF; return NEW; END $$ LANGUAGE plpgsql; 2 - Creating the sequences CREATE SEQUENCE c1_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; CREATE SEQUENCE c2_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; CREATE SEQUENCE c3_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; CREATE SEQUENCE c4_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; > ... [etc] ... 3 - Creating the TRIGGER CREATE TRIGGER t_users_update_code_column BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE tf_users_update_code_column(); ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
> > > 1 - Criando a funcao > > CREATE OR REPLACE FUNCTION tf_users_update_code_column() > RETURNS trigger AS $$ > > BEGIN > > IF NEW.company_id = 1 THEN > NEW.code = NEXTVAL('c1_users_code_seq'); > > ELSEIF NEW.company_id = 2 THEN > NEW.code = NEXTVAL('c2_users_code_seq'); > > ELSEIF NEW.company_id = 3 THEN > NEW.code = NEXTVAL('c3_users_code_seq'); > > ELSEIF NEW.company_id = 4 THEN > NEW.code = NEXTVAL('c4_users_code_seq'); > > ELSEIF NEW.company_id = 5 THEN > NEW.code = NEXTVAL('c5_users_code_seq'); > > ELSEIF NEW.company_id = 6 THEN > NEW.code = NEXTVAL('c6_users_code_seq'); > > ELSEIF NEW.company_id = 7 THEN > NEW.code = NEXTVAL('c7_users_code_seq'); > > ELSEIF NEW.company_id = 8 THEN > NEW.code = NEXTVAL('c8_users_code_seq'); > > ELSEIF NEW.company_id = 9 THEN > NEW.code = NEXTVAL('c9_users_code_seq'); > > ELSEIF NEW.company_id = 10 THEN > NEW.code = NEXTVAL('c10_users_code_seq'); > > END IF; > > return NEW; > > END > $$ LANGUAGE plpgsql; > > 2 - Criando as seq > > CREATE SEQUENCE c1_users_code_seq > INCREMENT 1 > MINVALUE 1 > MAXVALUE 9223372036854775807 START 1000; > CACHE 1; > CREATE SEQUENCE c2_users_code_seq > INCREMENT 1 > MINVALUE 1 > MAXVALUE 9223372036854775807 START 1000; > CACHE 1; > CREATE SEQUENCE c3_users_code_seq > INCREMENT 1 > MINVALUE 1 > MAXVALUE 9223372036854775807 START 1000; > CACHE 1; > CREATE SEQUENCE c4_users_code_seq > INCREMENT 1 > MINVALUE 1 > MAXVALUE 9223372036854775807 START 1000; > CACHE 1; > > ... [etc] ... > > 3 - Criando o TRIGGER > > CREATE TRIGGER t_users_update_code_column > BEFORE UPDATE OR INSERT > ON users > FOR EACH ROW > EXECUTE PROCEDURE tf_users_update_code_column(); > > > > > Isso funciona bem. Sem nenhum problema. > > O único problema é que eu teria milhares de seq para criar, pois haverá > milhares de clientes. > Isto é simplesmente inviável. > > - Por favor, baseado no que forneci a cima, poderiam dar alguma luz sobre > como fazer o mesmo, mas mais "simples"? Talvez utilizar uma outra tabela > para armazenar os dados, como já mencionado. > > Obrigado. > Lucas > > Ops... acabei de ver um erro meu: - Antes de INSERT e não de UPDATE/INSERT CREATE TRIGGER t_users_update_code_column BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE tf_users_update_code_column(); ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
2016-05-04 1:40 GMT+12:00 Euler Taveira: > On 03-05-2016 01:02, drum.lu...@gmail.com wrote: > > 1 - cada usuário na tabela users faz parte de uma empresa, essa empresa > > é "determinada" pela coluna company_id na tabela users. > > > > 2 - Cada usuário, inclui os dados dentro de users.code, mas se ele não > > incluir, a sequencia faz o trabalho. > > > > A questão, é que o valor default é de 1000, mas para cada empresa: > > > Você não resolve esse problema com sequências (a não ser que possa > existir "buracos"). Para sequências que não podem ter buracos, é > obrigatório o uso de uma tabela para controle da sequência. No seu caso, > basta ter uma tabela de controle contendo campos (empresa, sequencia). > Para fazer o INSERT, você deve codificar em alguma linguagem procedural > ou mesmo na linguagem utilizada porque é necessário testar se 'code' foi > informado ou não. > > 1 - Criando a funcao CREATE OR REPLACE FUNCTION tf_users_update_code_column() RETURNS trigger AS $$ BEGIN IF NEW.company_id = 1 THEN NEW.code = NEXTVAL('c1_users_code_seq'); ELSEIF NEW.company_id = 2 THEN NEW.code = NEXTVAL('c2_users_code_seq'); ELSEIF NEW.company_id = 3 THEN NEW.code = NEXTVAL('c3_users_code_seq'); ELSEIF NEW.company_id = 4 THEN NEW.code = NEXTVAL('c4_users_code_seq'); ELSEIF NEW.company_id = 5 THEN NEW.code = NEXTVAL('c5_users_code_seq'); ELSEIF NEW.company_id = 6 THEN NEW.code = NEXTVAL('c6_users_code_seq'); ELSEIF NEW.company_id = 7 THEN NEW.code = NEXTVAL('c7_users_code_seq'); ELSEIF NEW.company_id = 8 THEN NEW.code = NEXTVAL('c8_users_code_seq'); ELSEIF NEW.company_id = 9 THEN NEW.code = NEXTVAL('c9_users_code_seq'); ELSEIF NEW.company_id = 10 THEN NEW.code = NEXTVAL('c10_users_code_seq'); END IF; return NEW; END $$ LANGUAGE plpgsql; 2 - Criando as seq CREATE SEQUENCE c1_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; CREATE SEQUENCE c2_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; CREATE SEQUENCE c3_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; CREATE SEQUENCE c4_users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; ... [etc] ... 3 - Criando o TRIGGER CREATE TRIGGER t_users_update_code_column BEFORE UPDATE OR INSERT ON users FOR EACH ROW EXECUTE PROCEDURE tf_users_update_code_column(); Isso funciona bem. Sem nenhum problema. O único problema é que eu teria milhares de seq para criar, pois haverá milhares de clientes. Isto é simplesmente inviável. - Por favor, baseado no que forneci a cima, poderiam dar alguma luz sobre como fazer o mesmo, mas mais "simples"? Talvez utilizar uma outra tabela para armazenar os dados, como já mencionado. Obrigado. Lucas ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
On 03-05-2016 01:02, drum.lu...@gmail.com wrote: > 1 - cada usuário na tabela users faz parte de uma empresa, essa empresa > é "determinada" pela coluna company_id na tabela users. > > 2 - Cada usuário, inclui os dados dentro de users.code, mas se ele não > incluir, a sequencia faz o trabalho. > > A questão, é que o valor default é de 1000, mas para cada empresa: > Você não resolve esse problema com sequências (a não ser que possa existir "buracos"). Para sequências que não podem ter buracos, é obrigatório o uso de uma tabela para controle da sequência. No seu caso, basta ter uma tabela de controle contendo campos (empresa, sequencia). Para fazer o INSERT, você deve codificar em alguma linguagem procedural ou mesmo na linguagem utilizada porque é necessário testar se 'code' foi informado ou não. -- Euler Taveira Timbira - http://www.timbira.com.br/ PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
hmm.. na verdade preciso de algo a mais 1 - cada usuário na tabela users faz parte de uma empresa, essa empresa é "determinada" pela coluna company_id na tabela users. 2 - Cada usuário, inclui os dados dentro de users.code, mas se ele não incluir, a sequencia faz o trabalho. A questão, é que o valor default é de 1000, mas para cada empresa: *Exemplo:* Company Test1 - Company_id = 1 - user john01 = users.code: 1000 - user john02 = users.code: Nz - user john03 = users.code: 1001 - user john04 = users.code: Nz Company Test2 - Company_id = 2 - user matt01 = users.code: Text1 - user matt02 = users.code: 1000 - user matt03 = users.code: 1001 - user matt04 = users.code: 1002 Company Test3 - Company_id = 3 - user luke01 = users.code: 1000 - user luke02 = users.code: 1001 - user luke03 = users.code: Text2 - user luke04 = users.code: 1002 Como posso fazer isto? Poderiam me ajudar? ou dar uma luz? Obrigado! ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Olá pessoal, já resolvi fazendo dessa forma: -- 1 - Creating the Sequence: CREATE SEQUENCE users_code_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1000; CACHE 1; -- 2 - Setting the DEFAULT ALTER TABLE public.users ALTER COLUMN code SET DEFAULT NEXTVAL('users_code_seq'); -- 3 - Setting the column as NOT NULL; ALTER TABLE public.users ALTER COLUMN code SET NOT NULL; -- 4 - Creating a CONSTRAINT UNIQUE ALTER TABLE public.users ADD CONSTRAINT uc_users_code UNIQUE("code"); Obrigado ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Obrigado pela resposta, Matheus. Fica aqui o que fiz: -- 1 - Criando a Sequence: CREATE SEQUENCE users_code_seq > INCREMENT 1 > MINVALUE 1 > MAXVALUE 9223372036854775807 > START 1000; > CACHE 1; -- 2 - Determinando o value default ALTER TABLE public.users ALTER COLUMN code SET DEFAULT > NEXTVAL('users_code_seq'); -- 3 - Determinando coluna como NOT NULL; ALTER TABLE public.users ALTER COLUMN code SET NOT NULL; -- 4 - Criando o trigger CREATE TRIGGER update_code_column > BEFORE UPDATE OR INSERT > ON public.users > FOR EACH ROW > EXECUTE PROCEDURE public.users_code_seq(); *Tendo em vista que:* - A coluna não pode ser nulla - O usuário pode adicionar algo por conta, mas se não adicionar a sequencia/trigger faz o trabalho - O valor tem que ser unico Está correto? Está faltando algo? Obrigado. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
2016-04-20 19:47 GMT-03:00 drum.lu...@gmail.com: > nao pode ser DEFAULT pois o usuário pode escolher em setar value de sua > própria escolha > > É exatamente pra isso que o DEFAULT serve, se o inserir um valor explicitamente vai usar o que inseriu, se não inserir na coluna ou inserir usando DEFAULT (no INSERT INTO) então vai ser o DEFAULT. > >> >> Me parece uma má ideia, principalmente porque está sujeito à condições de >> corrida. Por que não usa uma sequence? >> >> >> > > é uma possibilidade... > porém gostaria de ao menos ajuda para comecar com a seq > A forma mais simples é usar um campo do tipo `serial` ou `bigserial`. Faça uns testes e estude um pouco, se tiver dúvidas poste aqui. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
On 21 April 2016 at 10:42, Matheus de Oliveirawrote: > > On Tue, Apr 19, 2016 at 7:31 PM, drum.lu...@gmail.com < > drum.lu...@gmail.com> wrote: > >> >>- Se users.code é empty, dá um default value = 1000 >> >> > O que significa "empty"? Se for NULL, você pode simplesmente fazer numa > trigger do tipo BEFORE: > > IF (NEW.code IS NULL) THEN > NEW.code = 1000; > END IF; > > Mas, provavelmente você quer simplesmente setar um DEFAULT: > > ALTER TABLE users ALTER code SET DEFAULT 1000; > > nao pode ser DEFAULT pois o usuário pode escolher em setar value de sua própria escolha > > Me parece uma má ideia, principalmente porque está sujeito à condições de > corrida. Por que não usa uma sequence? > > > é uma possibilidade... porém gostaria de ao menos ajuda para comecar com a seq Se vocês puderem ajudar.. seria ótimo. Obrigado Lucas ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
On Tue, Apr 19, 2016 at 7:31 PM, drum.lu...@gmail.comwrote: > >- Se users.code é empty, dá um default value = 1000 > > O que significa "empty"? Se for NULL, você pode simplesmente fazer numa trigger do tipo BEFORE: IF (NEW.code IS NULL) THEN NEW.code = 1000; END IF; Mas, provavelmente você quer simplesmente setar um DEFAULT: ALTER TABLE users ALTER code SET DEFAULT 1000; >- >- e increment_client_code em companies deve auto-incrementar pelo >próximo client code > > O que fiz até agora: > > DROP FUNCTION IF EXISTS client_code_increment_count(); >> CREATE OR REPLACE FUNCTION "public"."client_code_increment_count" () >> RETURNS TABLE("code" INT) AS >> $BODY$ >> SELECT MAX(CAST(users.code AS INT)) FROM users WHERE users.code ~ '^\d+$' >> AND company_id = 2 >> > Me parece uma má ideia, principalmente porque está sujeito à condições de corrida. Por que não usa uma sequence? At. -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Se usar nextval ao invés da coluna proposta é melhor, fique livre para mudar... também: o users.code value tem que ser único, já que o usuário pode setar um de escolha, ele não pode escolher outro que já está sendo usado por outro cliente. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Acabei enviando o e-mail errado e faltou informacões... *Vamos lá novamente:* Possuo duas tabelas: *- users* - code (Coluna) *- companies* - client_code_increment (Coluna) A coluna users.code, recebe um código pelo cliente. Mas ele pode escolher em não por nenhum dado lá. Caso o cliente escolhe por não inserir nada na coluna, eu tenho que dar para ele um número... um value O default é 1000 Por que adicionar um valor DEFAULT a users.code não é uma solucão? > Porque o cliente pode escolher em por algum outro dado nesta coluna. Então um valor DEFAULT não é a saída Qual é o default code? > O default é 1000. O cliente pode por qualquer coisa no users.code, porém se lá estiver NULL, se o cliente não puser nada, nós irá setar a próxima value... 1001, 1002, 1003 etc > > O que é increment_client_code? > É uma coluna onde armazena o último client_code usado: ALTER TABLE public.companies ADD COLUMN client_code_increment integer; ALTER TABLE public.companies ALTER COLUMN client_code_increment SET DEFAULT 1000; *table users:* > CREATE TABLE > users > ( > id INTEGER DEFAULT nextval('users_id_seq'::regclass) NOT NULL, > email CHARACTER VARYING DEFAULT ''::CHARACTER VARYING NOT NULL, > encrypted_password CHARACTER VARYING DEFAULT ''::CHARACTER VARYING > NOT NULL, > reset_password_token CHARACTER VARYING, > reset_password_sent_at TIMESTAMP(6) WITHOUT TIME ZONE, > remember_created_at TIMESTAMP(6) WITHOUT TIME ZONE, > sign_in_count INTEGER DEFAULT 0 NOT NULL, > current_sign_in_at TIMESTAMP(6) WITHOUT TIME ZONE, > last_sign_in_at TIMESTAMP(6) WITHOUT TIME ZONE, > current_sign_in_ip INET, > last_sign_in_ip INET, > created_at TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL, > updated_at TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL, > name CHARACTER VARYING, > confirmation_token CHARACTER VARYING, > confirmed_at TIMESTAMP(6) WITHOUT TIME ZONE, > confirmation_sent_at TIMESTAMP(6) WITHOUT TIME ZONE, > company_name CHARACTER VARYING, > country CHARACTER VARYING, > mobile_number CHARACTER VARYING, > landline_number CHARACTER VARYING, > staff_colour CHARACTER VARYING, > company_id INTEGER, > role_id INTEGER, > active BOOLEAN DEFAULT false, > deleted BOOLEAN DEFAULT false, > avatar_file_name CHARACTER VARYING, > avatar_content_type CHARACTER VARYING, > avatar_file_size INTEGER, > avatar_updated_at TIMESTAMP(6) WITHOUT TIME ZONE, > fax CHARACTER VARYING, > website CHARACTER VARYING, > business_type CHARACTER VARYING, > lead_source CHARACTER VARYING, > code CHARACTER VARYING, > notes TEXT, > status CHARACTER VARYING, > tsv TSVECTOR, > origin CHARACTER VARYING, > origin_id CHARACTER VARYING, > first_name CHARACTER VARYING, > last_name CHARACTER VARYING, > billed_client_id INTEGER, > username CHARACTER VARYING, > is_client BOOLEAN DEFAULT false, > job_share BOOLEAN DEFAULT true > ); *Table companies:* > CREATE TABLE > companies > ( > id INTEGER DEFAULT nextval('companies_id_seq'::regclass) NOT NULL, > name CHARACTER VARYING, > country CHARACTER VARYING, > timezone CHARACTER VARYING, > mobile_number CHARACTER VARYING, > email CHARACTER VARYING, > website CHARACTER VARYING, > phone CHARACTER VARYING, > created_at TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL, > updated_at TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL, > reference_increment INTEGER DEFAULT 1000, > activated BOOLEAN DEFAULT true, > enable_quotes BOOLEAN DEFAULT false, > allow_billing_client BOOLEAN DEFAULT true, > allow_templates_recurrence BOOLEAN DEFAULT true, > recurrence_limit INTEGER DEFAULT 30, > job_title_dropdown BOOLEAN DEFAULT false, > default_reference_prefix CHARACTER VARYING, > default_reference_increment INTEGER, > default_visit_start_day INTEGER, > default_visit_start_hour INTEGER, > default_visit_start_min INTEGER, > job_date_entry_duration BOOLEAN DEFAULT true, > default_visit_duration_hour INTEGER DEFAULT 0, > default_visit_duration_min INTEGER DEFAULT 30, > date_entry_short BOOLEAN DEFAULT true, > time_entry_24 BOOLEAN DEFAULT true, > time_field_increment INTEGER DEFAULT 10, > enable_job_share BOOLEAN DEFAULT true, > token CHARACTER VARYING > ); Como posso fazer isto acontecer? Como posso criar a funcao e o trigger para tal? Aqui está o que fiz até agora: (Mas não consigo seguir) DROP FUNCTION IF EXISTS client_code_increment_count(); > CREATE OR REPLACE FUNCTION "public"."client_code_increment_count" () > RETURNS
Re: [pgbr-geral] Funcão PostgreSQL 9.2
Olá, > > Pagamentos em um estado pendente não podem ser faturados e são excluídos > da sessão "invoice runs section" > > > Não consigo localizar o erro para corrigi-lo... > > > Podem dar uma luz? Se precisar de alguma info a mais posso fornecer. > > Obrigado! > > *Function:* > >> CREATE OR REPLACE FUNCTION "public"."g_status_types_jobs" ("client_id" >> bigint DEFAULT NULL::bigint, "output_order" character varying DEFAULT >> '-START_TIME'::character varying, "start_time" timestamp without time zone >> DEFAULT NULL::timestamp without time zone, "end_time" timestamp without >> time zone DEFAULT NULL::timestamp without time zone, "statuses" "text" >> DEFAULT NULL::"text", "status_types" "text" DEFAULT NULL::"text", >> "customer_id" bigint DEFAULT NULL::bigint, "user_id" bigint DEFAULT >> NULL::bigint, "recurrence_id" bigint DEFAULT NULL::bigint, "search_str" >> "text" DEFAULT NULL::"text", "unscheduled_is_desired" boolean DEFAULT >> false, "unassigned_is_desired" boolean DEFAULT false, "templated_status" >> boolean DEFAULT false, "by_job_ref" boolean DEFAULT false, >> "by_job_description" boolean DEFAULT false, "by_job_address" boolean >> DEFAULT false, "by_title" boolean DEFAULT false, "by_status" boolean >> DEFAULT false, "by_order_number" boolean DEFAULT false, "by_client" boolean >> DEFAULT false, "by_client_notes" boolean DEFAULT false, "by_billing_client" >> boolean DEFAULT false, "by_staff" boolean DEFAULT false, >> "by_notes_description" boolean DEFAULT false, "invoiceable_notes_only" >> boolean DEFAULT false) RETURNS TABLE("status_type_id" bigint, "jobs_count" >> bigint, "job_ids" "text", "status_type_data" "text") >> STABLE >> AS $dbvis$ >> SELECT >> COALESCE(s.status_type_id, -1) AS status_type_id, >> CAST(ROUND(SUM(s.jobs_count)) AS BIGINT) AS jobs_count, >> -- we concatenate the lists from all the status labels. some >> nullif/substring trickery is required here >> CONCAT('{', STRING_AGG(NULLIF(SUBSTRING(s.job_ids FROM 2 FOR >> (CHAR_LENGTH(s.job_ids) - 2)), ''), (CASE WHEN (s.job_ids != '{}') THEN ',' >> ELSE '' END)), '}') AS job_ids, >> (CASE >> WHEN (COALESCE(s.status_type_id, -1) != -1) THEN >> STRING_AGG(CONCAT( >> CAST(s.status_id AS TEXT), >> E'\t', REPLACE(REPLACE(s.status_label, E'\t', ''), E'\n', ''), >> E'\t', CAST(s.status_is_default AS TEXT), >> E'\t', CAST(s.jobs_count AS TEXT), >> E'\t', CAST(s.job_ids AS TEXT) >> ), E'\n') >> ELSE >> null >> END) AS status_type_data >> FROM >> public.g_statuses_jobs($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, >> $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25) AS s >> GROUP BY >> s.status_type_id >> ; >> $dbvis$ LANGUAGE sql > > > > > Só um update: ao invés dele mostrar um número X onde iria me apresentar os jobs que tem algo para ser billable e faturado, ele mostra o número de jobs que tem algo billable mas não ainda faturado. COALESCE(s.status_type_id, -1) -1 é "all" ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral