Re: [pgbr-geral] Funcão PostgreSQL 9.2

2016-05-22 Por tôpico Lucas Possamai
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

2016-05-05 Por tôpico drum.lu...@gmail.com
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

2016-05-05 Por tôpico drum.lu...@gmail.com
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

2016-05-04 Por tôpico drum.lu...@gmail.com
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

2016-05-04 Por tôpico drum.lu...@gmail.com
>
> 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

2016-05-03 Por tôpico drum.lu...@gmail.com
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

2016-05-03 Por tôpico drum.lu...@gmail.com
>
>
> 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-03 Por tôpico drum.lu...@gmail.com
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

2016-05-03 Por tôpico 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.


-- 
   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

2016-05-02 Por tôpico drum.lu...@gmail.com
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

2016-05-02 Por tôpico drum.lu...@gmail.com
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

2016-05-02 Por tôpico drum.lu...@gmail.com
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-22 Por tôpico Matheus de Oliveira
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

2016-04-20 Por tôpico drum.lu...@gmail.com
On 21 April 2016 at 10:42, Matheus de Oliveira 
wrote:

>
> 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

2016-04-20 Por tôpico Matheus de Oliveira
On Tue, Apr 19, 2016 at 7:31 PM, 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;


>-
>- 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

2016-04-20 Por tôpico drum.lu...@gmail.com
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

2016-04-19 Por tôpico drum.lu...@gmail.com
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

2016-03-01 Por tôpico drum.lu...@gmail.com
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