{"id":551,"date":"2012-02-29T08:00:48","date_gmt":"2012-02-29T13:00:48","guid":{"rendered":"http:\/\/www.latindevelopers.com\/ivancp\/?p=551"},"modified":"2012-02-27T15:15:18","modified_gmt":"2012-02-27T20:15:18","slug":"valores-auto_increment-personalizados","status":"publish","type":"post","link":"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/","title":{"rendered":"Valores auto_increment personalizados"},"content":{"rendered":"<p>En el Per\u00fa los formatos num\u00e9ricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo:<\/p>\n<pre>001-000034\r\n001-000035\r\n001-000036\r\n...<\/pre>\n<p>Para manejar esto en MySQL he preparado una soluci\u00f3n basada en <a href=\"http:\/\/www.latindevelopers.com\/ivancp\/2011\/11\/simulando-secuencias-en-mysql\/\" target=\"_blank\">otro articulo mio<\/a>:<\/p>\n<ol>\n<li>Crear la tabla para guardar los n\u00fameros actuales:\n<pre lang=\"sql\">create table _sequence\r\n(\r\n    seq_name varchar(50) not null primary key,\r\n    seq_group varchar(10) not null,\r\n    seq_val int unsigned not null\r\n);<\/pre>\n<\/li>\n<li>Crear una funci\u00f3n para obtener el valor siguiente e incrementarlo:\n<pre lang=\"sql\">delimiter \/\/\r\ndrop function if exists getNextCustomSeq\/\/\r\ncreate function getNextCustomSeq\r\n(\r\n\u00a0\u00a0\u00a0 sSeqName varchar(50),\r\n\u00a0\u00a0\u00a0 sSeqGroup varchar(10)\r\n) returns varchar(20)\r\nbegin\r\n\u00a0\u00a0\u00a0 declare nLast_val int; \r\n\r\n\u00a0\u00a0\u00a0 set nLast_val =\u00a0 (select seq_val\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 from _sequence\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 where seq_name = sSeqName\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 and seq_group = sSeqGroup);\r\n\u00a0\u00a0\u00a0 if nLast_val is null then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set nLast_val = 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 insert into _sequence (seq_name,seq_group,seq_val)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 values (sSeqName,sSeqGroup,nLast_Val);\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set nLast_val = nLast_val + 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 update _sequence set seq_val = nLast_val\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 where seq_name = sSeqName and seq_group = sSeqGroup;\r\n\u00a0\u00a0\u00a0 end if; \r\n\r\n\u00a0\u00a0\u00a0 set @ret = (select concat(sSeqGroup,'-',lpad(nLast_val,6,'0')));\r\n\u00a0\u00a0\u00a0 return @ret;\r\nend\/\/ \r\n\r\ndelimiter ;<\/pre>\n<\/li>\n<li>Crear un procedimiento almacenado para modificar el valor actual:\n<pre lang=\"sql\">delimiter \/\/\r\ndrop procedure if exists sp_setSeqCustomVal\/\/\r\ncreate procedure sp_setCustomVal(sSeqName varchar(50), \u00a0\r\n              sSeqGroup varchar(10), nVal int unsigned)\r\nbegin\r\n\u00a0\u00a0\u00a0 if (select count(*) from _sequence \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 where seq_name = sSeqName \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 and seq_group = sSeqGroup) = 0 then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 insert into _sequence (seq_name,seq_group,seq_val)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 values (sSeqName,sSeqGroup,nVal);\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 update _sequence set seq_val = nVal\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 where seq_name = sSeqName and seq_group = sSeqGroup;\r\n\u00a0\u00a0\u00a0 end if;\r\nend\/\/\r\ndelimiter ;<\/pre>\n<\/li>\n<\/ol>\n<p><strong>Haciendo algunas pruebas:<\/strong><\/p>\n<ol>\n<li>Crear una tabla:\n<pre lang=\"sql\">create table custom_autonums\r\n(\r\n\u00a0\u00a0 id int not null primary key auto_increment,\r\n\u00a0\u00a0 seq_1 varchar(20), -- custom sequence 1\r\n\u00a0\u00a0 seq_2 varchar(20), -- custom sequence 2\r\n\u00a0\u00a0 unique(seq_1),\r\n\u00a0\u00a0 unique(seq_2)\r\n);<\/pre>\n<\/li>\n<li>Crear un trigger para la tabla:\n<pre lang=\"sql\">delimiter \/\/\r\ndrop trigger if exists custom_autonums_bi\/\/\r\n\r\ncreate trigger custom_autonums_bi before insert on custom_autonums\r\nfor each row\r\nbegin\r\n\u00a0\u00a0 set new.seq_1 = getNextCustomSeq(\"seq_1\",\"001\");\r\n\u00a0\u00a0 set new.seq_2 = getNextCustomSeq(\"seq_2\",\"DBA\");\r\nend\/\/\r\n\r\ndelimiter ;<\/pre>\n<\/li>\n<li>Insertando algunos valores:\n<pre lang=\"sql\">insert into custom_autonums (id) values (null),(null),(null);\r\nselect * from custom_autonums;\r\n+----+------------+------------+\r\n| id | seq_1\u00a0\u00a0\u00a0\u00a0\u00a0 | seq_2\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n+----+------------+------------+\r\n|\u00a0 4 | 001-000001 | DBA-000001 |\r\n|\u00a0 5 | 001-000002 | DBA-000002 |\r\n|\u00a0 6 | 001-000003 | DBA-000003 |\r\n+----+------------+------------+\r\n3 rows in set (0.00 sec)<\/pre>\n<\/li>\n<li>Alterando los valores actuales:\n<pre lang=\"sql\">call sp_setCustomVal('seq_1','001',675);\r\n\r\ninsert into custom_autonums (id) values (null),(null),(null);\r\nselect * from custom_autonums;\r\n+----+------------+------------+\r\n| id | seq_1\u00a0\u00a0\u00a0\u00a0\u00a0 | seq_2\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n+----+------------+------------+\r\n|\u00a0 4 | 001-000001 | DBA-000001 |\r\n|\u00a0 5 | 001-000002 | DBA-000002 |\r\n|\u00a0 6 | 001-000003 | DBA-000003 |\r\n|\u00a0 7 | 001-000676 | DBA-000004 |\r\n|\u00a0 8 | 001-000677 | DBA-000005 |\r\n|\u00a0 9 | 001-000678 | DBA-000006 |\r\n+----+------------+------------+\r\n6 rows in set (0.00 sec)<\/pre>\n<\/li>\n<\/ol>\n<p>Enjoy!<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Compartelo:<\/h3><div class=\"sd-content\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-551\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=facebook\" target=\"_blank\" title=\"Haz clic para compartir en Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-551\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=twitter\" target=\"_blank\" title=\"Haz clic para compartir en Twitter\"><span>Twitter<\/span><\/a><\/li><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>M\u00e1s<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-email\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-email sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=email\" target=\"_blank\" title=\"Haz clic para enviar por correo electr\u00f3nico a un amigo\"><span>Correo electr\u00f3nico<\/span><\/a><\/li><li class=\"share-print\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-print sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/\" target=\"_blank\" title=\"Haz clic para imprimir\"><span>Imprimir<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-551\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=linkedin\" target=\"_blank\" title=\"Haz clic para compartir en LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>En el Per\u00fa los formatos num\u00e9ricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo: 001-000034 001-000035 001-000036 &#8230; Para manejar esto en MySQL he preparado una soluci\u00f3n basada en otro &hellip; <a href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Compartelo:<\/h3><div class=\"sd-content\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-551\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=facebook\" target=\"_blank\" title=\"Haz clic para compartir en Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-551\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=twitter\" target=\"_blank\" title=\"Haz clic para compartir en Twitter\"><span>Twitter<\/span><\/a><\/li><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>M\u00e1s<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-email\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-email sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=email\" target=\"_blank\" title=\"Haz clic para enviar por correo electr\u00f3nico a un amigo\"><span>Correo electr\u00f3nico<\/span><\/a><\/li><li class=\"share-print\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-print sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/\" target=\"_blank\" title=\"Haz clic para imprimir\"><span>Imprimir<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-551\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2012\/02\/valores-auto_increment-personalizados\/?share=linkedin\" target=\"_blank\" title=\"Haz clic para compartir en LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"author":1,"featured_media":249,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[7],"tags":[12,30],"jetpack_featured_media_url":"https:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png","jetpack_shortlink":"https:\/\/wp.me\/p1tEO5-8T","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/551"}],"collection":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/comments?post=551"}],"version-history":[{"count":1,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/551\/revisions"}],"predecessor-version":[{"id":552,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/551\/revisions\/552"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/media\/249"}],"wp:attachment":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/media?parent=551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/categories?post=551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/tags?post=551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}