"soap_call__" function returns only last TCP packet in the soap context buffer - gsoap

I have a problem as I get an answer from the WEB service that is split in many TCP packets.
Create 'MercuriusService.h'
1) wsdl2h -o MercuriusService.h -t MRJ_typemap.dat -c ./WSDL/provider/MercuriusService.wsdl
2) Add WS-Security support in "Import" section of MercuriusService.h
#import "wsse.h" // wsse = <http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd>
Generate C code
3) soapcpp2 -c -C MercuriusService.h
I work in C language and I am client.
Makefile gSOAP oriented content
INCL= commons.h soapH.h soapStub.h MercuriusServiceSoap12.nsmap
OBJS= soapC.o soapClient.o gsoap/stdsoap2.o gsoap/dom.o \
gsoap/plugin/mecevp.o gsoap/plugin/threads.o gsoap/plugin/smdevp.o gsoap/plugin/wsseapi.o \
commons.o
commons.h and commons.o are part of my program
Testing the program
As the reply comes in more than on TCP packet the "soap_call_xxx" function
fills in the soap buffer with only the last packet as can be seen here after :
In TEST.log I found :
...
Read 4344 bytes from socket=5/fd=0
Read count=4344 (+4344)
...
Read 999 bytes from socket=5/fd=0
Read count=5343 (+999)
...
And in the log of my client I get on "soap_call__xxx" inthe soap buffer :
2020-04-03 12:52:27 - TST_MERCURJUS - from commons_request (thread 00000)
000 : X6F X6E X2F X3E X3C X6E X73 X34 X3A X45 X78 X61 X6D X69 X6E X61 | on/><ns4:Examina
016 : X74 X69 X6F X6E X43 X6F X6D X6D X65 X6E X74 X73 X2F X3E X3C X2F | tionComments/></
032 : X6E X73 X34 X3A X45 X78 X61 X6D X49 X6E X66 X6F X3E X3C X6E X73 | ns4:ExamInfo><ns
048 : X34 X3A X45 X78 X61 X6D X49 X6E X66 X6F X3E X3C X6E X73 X34 X3A | 4:ExamInfo><ns4:
064 : X45 X76 X6F X6C X75 X74 X69 X6F X6E X4E X75 X6D X62 X65 X72 X3E | EvolutionNumber>
080 : X32 X32 X3C X2F X6E X73 X34 X3A X45 X76 X6F X6C X75 X74 X69 X6F | 22</ns4:Evolutio
096 : X6E X4E X75 X6D X62 X65 X72 X3E X3C X6E X73 X34 X3A X45 X78 X61 | nNumber><ns4:Exa
112 : X6D X4E X75 X6D X62 X65 X72 X3E X33 X3C X2F X6E X73 X34 X3A X45 | mNumber>3</ns4:E
128 : X78 X61 X6D X4E X75 X6D X62 X65 X72 X3E X3C X6E X73 X34 X3A X52 | xamNumber><ns4:R
144 : X65 X73 X75 X6C X74 X4E X75 X6D X62 X65 X72 X3E X31 X3C X2F X6E | esultNumber>1</n
160 : X73 X34 X3A X52 X65 X73 X75 X6C X74 X4E X75 X6D X62 X65 X72 X3E | s4:ResultNumber>
176 : X3C X6E X73 X34 X3A X45 X78 X61 X6D X44 X61 X74 X65 X3E X32 X30 | <ns4:ExamDate>20
192 : X31 X39 X2D X30 X37 X2D X30 X32 X3C X2F X6E X73 X34 X3A X45 X78 | 19-07-02</ns4:Ex
208 : X61 X6D X44 X61 X74 X65 X3E X3C X6E X73 X34 X3A X45 X78 X61 X6D | amDate><ns4:Exam
224 : X69 X6E X61 X74 X69 X6F X6E X54 X79 X70 X65 X3E X4D X3C X2F X6E | inationType>M</n
240 : X73 X34 X3A X45 X78 X61 X6D X69 X6E X61 X74 X69 X6F X6E X54 X79 | s4:ExaminationTy
256 : X70 X65 X3E X3C X6E X73 X34 X3A X45 X78 X61 X6D X69 X6E X61 X74 | pe><ns4:Examinat
272 : X69 X6F X6E X52 X65 X73 X75 X6C X74 X3E X34 X3C X2F X6E X73 X34 | ionResult>4</ns4
288 : X3A X45 X78 X61 X6D X69 X6E X61 X74 X69 X6F X6E X52 X65 X73 X75 | :ExaminationResu
304 : X6C X74 X3E X3C X6E X73 X34 X3A X43 X6F X6E X64 X69 X74 X69 X6F | lt><ns4:Conditio
320 : X6E X61 X6C X52 X65 X69 X6E X73 X74 X61 X74 X65 X6D X65 X6E X74 | nalReinstatement
336 : X44 X75 X72 X61 X74 X69 X6F X6E X2F X3E X3C X6E X73 X34 X3A X45 | Duration/><ns4:E
352 : X78 X61 X6D X69 X6E X61 X74 X69 X6F X6E X43 X6F X6D X6D X65 X6E | xaminationCommen
368 : X74 X73 X2F X3E X3C X2F X6E X73 X34 X3A X45 X78 X61 X6D X49 X6E | ts/></ns4:ExamIn
384 : X66 X6F X3E X3C X6E X73 X34 X3A X45 X78 X61 X6D X49 X6E X66 X6F | fo><ns4:ExamInfo
400 : X3E X3C X6E X73 X34 X3A X45 X76 X6F X6C X75 X74 X69 X6F X6E X4E | ><ns4:EvolutionN
416 : X75 X6D X62 X65 X72 X3E X32 X32 X3C X2F X6E X73 X34 X3A X45 X76 | umber>22</ns4:Ev
432 : X6F X6C X75 X74 X69 X6F X6E X4E X75 X6D X62 X65 X72 X3E X3C X6E | olutionNumber><n
448 : X73 X34 X3A X45 X78 X61 X6D X4E X75 X6D X62 X65 X72 X3E X34 X3C | s4:ExamNumber>4<
464 : X2F X6E X73 X34 X3A X45 X78 X61 X6D X4E X75 X6D X62 X65 X72 X3E | /ns4:ExamNumber>
480 : X3C X6E X73 X34 X3A X52 X65 X73 X75 X6C X74 X4E X75 X6D X62 X65 | <ns4:ResultNumbe
496 : X72 X3E X31 X3C X2F X6E X73 X34 X3A X52 X65 X73 X75 X6C X74 X4E | r>1</ns4:ResultN
512 : X75 X6D X62 X65 X72 X3E X3C X6E X73 X34 X3A X45 X78 X61 X6D X44 | umber><ns4:ExamD
528 : X61 X74 X65 X3E X32 X30 X31 X39 X2D X30 X37 X2D X30 X32 X3C X2F | ate>2019-07-02</
544 : X6E X73 X34 X3A X45 X78 X61 X6D X44 X61 X74 X65 X3E X3C X6E X73 | ns4:ExamDate><ns
560 : X34 X3A X45 X78 X61 X6D X69 X6E X61 X74 X69 X6F X6E X54 X79 X70 | 4:ExaminationTyp
576 : X65 X3E X53 X3C X2F X6E X73 X34 X3A X45 X78 X61 X6D X69 X6E X61 | e>S</ns4:Examina
592 : X74 X69 X6F X6E X54 X79 X70 X65 X3E X3C X6E X73 X34 X3A X45 X78 | tionType><ns4:Ex
608 : X61 X6D X69 X6E X61 X74 X69 X6F X6E X52 X65 X73 X75 X6C X74 X3E | aminationResult>
624 : X34 X3C X2F X6E X73 X34 X3A X45 X78 X61 X6D X69 X6E X61 X74 X69 | 4</ns4:Examinati
640 : X6F X6E X52 X65 X73 X75 X6C X74 X3E X3C X6E X73 X34 X3A X43 X6F | onResult><ns4:Co
656 : X6E X64 X69 X74 X69 X6F X6E X61 X6C X52 X65 X69 X6E X73 X74 X61 | nditionalReinsta
672 : X74 X65 X6D X65 X6E X74 X44 X75 X72 X61 X74 X69 X6F X6E X2F X3E | tementDuration/>
688 : X3C X6E X73 X34 X3A X45 X78 X61 X6D X69 X6E X61 X74 X69 X6F X6E | <ns4:Examination
704 : X43 X6F X6D X6D X65 X6E X74 X73 X2F X3E X3C X2F X6E X73 X34 X3A | Comments/></ns4:
720 : X45 X78 X61 X6D X49 X6E X66 X6F X3E X3C X6E X73 X34 X3A X50 X56 | ExamInfo><ns4:PV
736 : X4E X75 X6D X62 X65 X72 X3E X41 X4E X2F X41 X2F X39 X30 X2F X4C | Number>AN/A/90/L
752 : X42 X2F X34 X39 X38 X33 X35 X30 X2F X32 X30 X31 X38 X3C X2F X6E | B/498350/2018</n
768 : X73 X34 X3A X50 X56 X4E X75 X6D X62 X65 X72 X3E X3C X6E X73 X34 | s4:PVNumber><ns4
784 : X3A X4C X69 X66 X65 X4C X6F X6E X67 X49 X6E X64 X69 X63 X61 X74 | :LifeLongIndicat
800 : X6F X72 X3E X30 X3C X2F X6E X73 X34 X3A X4C X69 X66 X65 X4C X6F | or>0</ns4:LifeLo
816 : X6E X67 X49 X6E X64 X69 X63 X61 X74 X6F X72 X3E X3C X6E X73 X34 | ngIndicator><ns4
832 : X3A X44 X65 X73 X63 X72 X69 X70 X74 X69 X6F X6E X43 X6F X64 X65 | :DescriptionCode
848 : X3E X30 X34 X3C X2F X6E X73 X34 X3A X44 X65 X73 X63 X72 X69 X70 | >04</ns4:Descrip
864 : X74 X69 X6F X6E X43 X6F X64 X65 X3E X3C X6E X73 X34 X3A X41 X70 | tionCode><ns4:Ap
880 : X70 X65 X61 X6C X49 X6E X64 X69 X63 X61 X74 X6F X72 X3E X30 X3C | pealIndicator>0<
896 : X2F X6E X73 X34 X3A X41 X70 X70 X65 X61 X6C X49 X6E X64 X69 X63 | /ns4:AppealIndic
912 : X61 X74 X6F X72 X3E X3C X2F X6E X73 X34 X3A X69 X6E X66 X72 X61 | ator></ns4:infra
928 : X63 X74 X69 X6F X6E X49 X6E X66 X6F X3E X3C X2F X6E X73 X33 X3A | ctionInfo></ns3:
944 : X69 X6E X66 X6F X3E X3C X2F X6E X73 X33 X3A X46 X69 X6E X64 X49 | info></ns3:FindI
960 : X6E X66 X6F X52 X65 X73 X70 X6F X6E X73 X65 X3E X3C X2F X65 X6E | nfoResponse></en
976 : X76 X3A X42 X6F X64 X79 X3E X3C X2F X73 X6F X61 X70 X3A X45 X6E | v:Body></soap:En
992 : X76 X65 X6C X6F X70 X65 X3E _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | velope>
This is exactly the amount of bytes of the second TCP packet !!!
Here is the code of the part of my program handling the SOAP requests :
#include <ctype.h>
#include "decap/structs.h"
#include "decap/tcp_threads.h"
#include "gpi_tools.h"
#include "mecevp.h"
#include "smdevp.h"
#include "wsseapi.h"
#include "soapH.h"
#include "MercuriusServiceSoap12.nsmap"
#include "commons.h"
const char soap_action_find_info[] = "findInfo";
const char soap_action_find_user[] = "findUser";
const char *soap_action[] = { soap_action_find_info, soap_action_find_info, soap_action_find_user };
...
int commons_request( tcp_thread *me, char *request, char *soap_endpoint, char *pem_file )
{
int i;
int params_len;
FILE *fd;
char file_spec[192];
EVP_PKEY *rsa_private_key = NULL;
char *indicator_str;
char *requester_language;
char *datetime;
rt_request_type request_type;
time_t cur_time;
time_t req_time;
dom__Indicator indicator = dom__Indicator__2;
int soap_status;
specific_datas *sd = (specific_datas *)me->specific;
gpi_file_spec( file_spec, pem_file );
fd = fopen( file_spec, "r" );
rsa_private_key = PEM_read_PrivateKey( fd, NULL, NULL, (void *)pem_password );
fclose( fd );
params_len = (int)strlen( request );
for( i = 0; i < params_len; i++ )
if( request[i] == (sd->request_separator) )
request[i] = (char)0x00;
/* WS Security */
soap_init2( &(sd->soap), SOAP_IO_KEEPALIVE, SOAP_XML_CANONICAL|SOAP_IO_KEEPALIVE );
(sd->soap).connect_timeout = 10;
(sd->soap).send_timeout = 15;
(sd->soap).recv_timeout = 15;
(sd->soap).transfer_timeout = 30;
soap_register_plugin( &(sd->soap), soap_wsse );
soap_wsse_add_Security( &(sd->soap) );
soap_wsse_add_BinarySecurityTokenPEM( &(sd->soap), "X509Token", file_spec );
soap_wsse_add_KeyInfo_SecurityTokenReferenceX509( &(sd->soap), "#X509Token" );
soap_wsse_sign_body( &(sd->soap), SOAP_SMD_SIGN_RSA_SHA1, rsa_private_key, 0 );
/* SSL management */
soap_ssl_init();
soap_ssl_client_context( &(sd->soap), SOAP_SSL_DEFAULT, file_spec, pem_password, NULL, NULL, NULL );
/* Building request */
time( &cur_time );
(sd->requester).nationalNumber = (char *)requester_national_number[(sd->request_mode)];
req_time = cur_time;
switch( toupper( request[0] ) )
{
case 'R':
request_type = rt_nat_nbr;
break;
case 'M':
request_type = rt_mach_site;
break;
case 'N':
request_type = rt_name_birth;
break;
default:
request_type = rt_invalid;
}
indicator_str = request + strlen( request ) + 1;
switch( indicator_str[0] )
{
case '0':
indicator = dom__Indicator__0;
break;
case '1':
indicator = dom__Indicator__1;
break;
case '2':
indicator = dom__Indicator__2;
break;
case '3':
indicator = dom__Indicator__3;
break;
}
requester_language = indicator_str + strlen( indicator_str ) + 1;
switch( toupper( requester_language[0] ) )
{
case 'F':
(sd->requester).language = com__Language__FR;
break;
case 'N':
(sd->requester).language = com__Language__NL;
break;
case 'D':
(sd->requester).language = com__Language__DE;
break;
case 'E':
(sd->requester).language = com__Language__EN;
break;
default:
(sd->requester).language = com__Language__XX;
}
if( request_type == rt_nat_nbr )
{
char *rrn_number;
rrn_number = requester_language + strlen( requester_language ) + 1;
datetime = rrn_number + strlen( rrn_number ) + 1;
if( strlen( datetime ) > 0 )
req_time = decap_str_to_time_t( datetime, "%Y-%m-%d" );
(sd->find_info_request).requester = &(sd->requester);
(sd->find_info_request).criteria = &(sd->info_criteria);
(sd->info_criteria).__union_InfoCriteria = 1;
(sd->info_criteria).union_InfoCriteria.nationalNumberCriteria = &(sd->nationalNumberCriteria);
(sd->nationalNumberCriteria).__union_NationalNumberCriteria = 1;
(sd->nationalNumberCriteria).union_NationalNumberCriteria.nationalNumber = rrn_number;
(sd->info_criteria).infoDateTime = req_time;
(sd->info_criteria).__sizeindicator = 1;
(sd->info_criteria).indicator = &indicator;
soap_status = soap_call___mrj__findInfo( &(sd->soap), soap_endpoint, soap_action[request_type],
&(sd->find_info_request), &(sd->find_info_response) );
}
else if( request_type == rt_mach_site )
{
char *mach_id;
char *site_id;
mach_id = requester_language + strlen( requester_language ) + 1;
site_id = mach_id + strlen( mach_id ) + 1;
datetime = site_id + strlen( site_id ) + 1;
if( strlen( datetime ) > 0 )
req_time = decap_str_to_time_t( datetime, "%Y-%m-%d" );
(sd->find_info_request).requester = &(sd->requester);
(sd->find_info_request).criteria = &(sd->info_criteria);
(sd->info_criteria).__union_InfoCriteria = 2;
(sd->info_criteria).union_InfoCriteria.machCriteria = &(sd->machCriteria);
(sd->machCriteria).machId = mach_id;
(sd->machCriteria).siteId = site_id;
(sd->info_criteria).infoDateTime = req_time;
(sd->info_criteria).__sizeindicator = 1;
(sd->info_criteria).indicator = &indicator;
soap_status = soap_call___mrj__findInfo( &(sd->soap), soap_endpoint, soap_action[request_type],
&(sd->find_info_request), &(sd->find_info_response) );
}
else if( request_type == rt_name_birth )
{
char *name;
char *firstName;
char *birthDate;
name = requester_language + strlen( requester_language ) + 1;
firstName = name + strlen( name ) + 1;
birthDate = firstName + strlen( firstName ) + 1;
datetime = birthDate + strlen( birthDate ) + 1;
if( strlen( datetime ) > 0 )
req_time = decap_str_to_time_t( datetime, "%Y-%m-%d" );
(sd->find_user_request).requester = &(sd->requester);
(sd->find_user_request).criteria = &(sd->user_criteria);
(sd->user_criteria).nameCriteria = &(sd->nameCriteria);
(sd->nameCriteria).name = name;
(sd->nameCriteria).firstName = firstName;
(sd->nameCriteria).birthDate = birthDate;
(sd->user_criteria).infoDateTime = req_time;
(sd->user_criteria).__sizeindicator = 1;
(sd->user_criteria).indicator = &indicator;
soap_status = soap_call___mrj__findUser( &(sd->soap), soap_endpoint, soap_action[request_type],
&(sd->find_user_request), &(sd->find_user_response) );
}
(sd->soap).buf[(sd->soap).buflen] = (char)0x00;
return( soap_status );
}
Could this problem come from bad parameters in "soap_init2" ?
Any help is welcome.

The message received is saved to RECV.log when the code is compiled in DEBUG mode.
To clarify the buffering scheme, the XML engine of gsoap does not store the entire message received in a buffer. Rather, for performance reasons, the engine and generated code incrementally deserialize inbound messages by reading a block of data at a time. Previous data read is discarded from the buffer.
This is evident when you look at the TEST.log:
...
Read 4344 bytes from socket=5/fd=0
Read count=4344 (+4344)
...
Read 999 bytes from socket=5/fd=0
Read count=5343 (+999)
...
Each read operation fills the buffer again with minimal blocking. Therefore, the buffer may contain anything, i.e. one or more TCP packets or as little data as a single byte. When you dump the buffer at the end of the message, it only contains the last TCP packet received.
This approach to incremental parsing and deserialization is efficient as the deserializer can start immediately when the first packet arrives.

Related

How to send a discord.js random embed?

I'm looking for a code that would let me send an random embed that I created when someone types a command. For the moment with the code that I have, all embeds are being sent but I want the bot to only send a random one, not all 4. Is this possible ?
module.exports = class PizzaTest extends BaseCommand {
constructor() {
super('pizzatest', 'fun', []);
}
async run(client, message, args) {
const capreseEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Caprese** ! \n\n *Les ingrédients sont: Mozarella, Olives, Tomates Séchées & Basilic.*`)
.setThumbnail('https://i.imgur.com/McSXASC.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58");
const reineEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Reine** ! \n\n *Les ingrédients sont: Mozarella, Jambon, Champignons & Basilic.*`)
.setThumbnail('https://i.imgur.com/AKStODY.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58");
const vegeEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Végétarienne** ! \n\n *Les ingrédients sont: Mozarella, Olives, Poivrons, Champignons & Basilic.*`)
.setThumbnail('https://i.imgur.com/U0qrSk9.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58");
const andalouseEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Andalouse** ! \n\n *Les ingrédients sont: Mozarella, Poivrons, Boulette de Boeuf & Sauce Andalouse.*`)
.setThumbnail('https://i.imgur.com/dvgkC4K.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58");
message.channel.send(capreseEmbed).catch(err => console.log(err));
message.channel.send(reineEmbed).catch(err => console.log(err));
message.channel.send(vegeEmbed).catch(err => console.log(err));
message.channel.send(andalouseEmbed).catch(err => console.log(err));
}
}
I know that I can use something like .setDescription(description) with all of them stated at the beginning but I need the description and thumbnail to match so that wouldn't work I guess ?
Thank you!
Here's an easy way:
const Thumbnail = [
'https://i.imgur.com/McSXASC.png',
'https://i.imgur.com/AKStODY.png',
'https://i.imgur.com/U0qrSk9.png',
'https://i.imgur.com/dvgkC4K.png',
]
const Description = [
', il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Caprese** ! \n\n *Les ingrédients sont: Mozarella, Olives, Tomates Séchées & Basilic.*`',
', il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Végétarienne** ! \n\n *Les ingrédients sont: Mozarella, Olives, Poivrons, Champignons & Basilic.*`',
', il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Végétarienne** ! \n\n *Les ingrédients sont: Mozarella, Olives, Poivrons, Champignons & Basilic.*`',
', il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Andalouse** ! \n\n *Les ingrédients sont: Mozarella, Poivrons, Boulette de Boeuf & Sauce Andalouse.*`',
]
let random = Math.floor(Math.random() * Thumbnail.length)
const embed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription( '`' + message.author.username + Description[random])
.setThumbnail(Thumbnail[random])
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58")
message.channel.send(embed)
Yes this is possible and very simple to do:
const capreseEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Caprese** ! \n\n *Les ingrédients sont: Mozarella, Olives, Tomates Séchées & Basilic.*`)
.setThumbnail('https://i.imgur.com/McSXASC.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58")
const reineEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Reine** ! \n\n *Les ingrédients sont: Mozarella, Jambon, Champignons & Basilic.*`)
.setThumbnail('https://i.imgur.com/AKStODY.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58")
const vegeEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Végétarienne** ! \n\n *Les ingrédients sont: Mozarella, Olives, Poivrons, Champignons & Basilic.*`)
.setThumbnail('https://i.imgur.com/U0qrSk9.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58")
const andalouseEmbed = new Discord.MessageEmbed()
.setTitle('• Attention, pizza en livraison! 🚀')
.setDescription(`<#${message.author.id}>, il semblerait que ta commande soit prête. Tu viens de recevoir une magnique pizza **Andalouse** ! \n\n *Les ingrédients sont: Mozarella, Poivrons, Boulette de Boeuf & Sauce Andalouse.*`)
.setThumbnail('https://i.imgur.com/dvgkC4K.png')
.setFooter(message.author.username, message.author.displayAvatarURL())
.setTimestamp()
.setColor("#baff58")
var embedArr = [capreseEmbed, reineEmbed, vegeEmbed, andalouseEmbed];
let randomEmbed = embedArr[Math.floor(Math.random() * embedArr.length)];
message.channel.send(randomEmbed);
At first we define all embeds, like you already did. Then we store them in an array. From that array we want to get a value from a random index. That is done in randomEmbed. Then we send the random embed into the channel.

How to show and hide tkinter entry box when select yes from drop down

i have created an entry form for personal use using tkinter. Now i want to add a function in it that when yes if select from drop down show entry box otherwise hide it.
i have written the codes but it is not working neither
throwing the error below is the snippet of my code
field = ["YES",""]
query_text = StringVar()
lblname = Label(f1aa, font=("arial", 10, "bold"), text="Query/Reply", bd=8, anchor="w")
lblname.grid(row=0, column=0, sticky=W)
txtname28 = OptionMenu(f1aa, query_text, *field)
txtname28.grid(row=0, column=1, sticky=W)
hidden = False
hidden_text = StringVar()
e = Entry(f1aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = hidden_text)
e.grid(row=0, column=2)
if query_text == "YES":
e.grid()
else:
e.grid_remove()
#hidden = not hidden
full codes
from tkinter import *
from tkinter import ttk
import random
import time
import datetime
from datetime import date
from tkinter import messagebox
import Backend
import csv
import sqlite3
import re
root = Tk()
root.geometry("1350x750+0+0")
root.title("OTRS Management System")
root.configure(background="gray28")
Tops = Frame(root, width=1350, height=100,bd=14, relief="raise")
Tops.pack(side=TOP)
f1 = Frame(root, width=900, height=650, bd=8, relief="raise")
f1.pack(side=LEFT)
f2 = Frame(root, width=440, height=650,bd=8, relief="raise")
f2.pack(side=RIGHT)
ft2 = Frame(f2, width=440, height=450,bd=12, relief="raise")
ft2.pack(side=TOP)
fb2 = Frame(f2, width=440, height=250,bd=16, relief="raise")
fb2.pack(side=BOTTOM)
f1a = Frame(f1, width=900, height=330,bd=8, relief="raise")
f1a.pack(side=TOP)
f2a = Frame(f1, width=900, height=320,bd=6, relief="raise")
f2a.pack(side=BOTTOM)
f1aa = Frame(f1a, width=400, height=330,bd=16, relief="raise")
f1aa.pack(side=LEFT)
f1ab = Frame(f1a, width=400, height=330,bd=16, relief="raise")
f1ab.pack(side=RIGHT)
f2aa = Frame(f2a, width=450, height=330,bd=14, relief="raise")
f2aa.pack(side=LEFT)
f2ab = Frame(f2a, width=450, height=330,bd=14, relief="raise")
f2ab.pack(side=LEFT)
Tops.configure(background="LightGoldenrod4")
f1.configure(background="LightGoldenrod4")
f2.configure(background="LightGoldenrod4")
field = ["YES",""]
def view_command():
list1.delete(0,END)
for row in Backend.view():
list1.insert(END,row)
def add_command():
count_total_selected = [query_text.get(),
phase_and_tower.get(), saleable_mapping.get(), floor_plans.get(), options.get(), images.get(),
cons.get(), video.get(), date.get(), amenities.get(), bank.get(), latlong.get(), usp.get(),
facttable.get(), prj_name.get(), prj_desp.get(), specification.get(), builder.get(), tco.get(),
brochure.get(), prj_deactivation.get(), np.get(), np2.get(), np_refresh.get()]
count = 0
for i in count_total_selected:
if i=="YES":
count+=1
print(count)
if str(ticket_text.get()).isdigit()== False or len(str(ticket_text.get())) < 4 or ticket_text.get()=="" or agent_text.get()=="" or queue_text.get()=="" or inventory.get()=="":
toplevel = Toplevel()
label1 = Label(toplevel, text="***If you are receiving this it means you have forgotten the below points: \n Ticket number is not entered \n Queue is not selected \n Agent Name is not selected.\n Please note if XID number is not available write NA in the BOX\n Please make sure XID number starts with r or c.", height=10, width=55)
label1.pack()
else:
Backend.insert(fdate, ticket_text.get(),agent_text.get(), query_text.get(), queue_text.get(), phase_and_tower.get(),saleable_mapping.get(),floor_plans.get(),options.get(), images.get(),cons.get(), video.get(),date.get(),amenities.get(),bank.get(),latlong.get(), usp.get(), facttable.get(),prj_name.get(),prj_desp.get(),specification.get(),builder.get(),tco.get(),brochure.get(),prj_deactivation.get(),np.get(),np2.get(), inventory.get(), np_refresh.get(), count)
list1.delete(0,END)
list1.insert(END,(fdate, ticket_text.get(),agent_text.get(), query_text.get(), queue_text.get(), phase_and_tower.get(),saleable_mapping.get(),floor_plans.get(),options.get(), images.get(),cons.get(), video.get(),date.get(),amenities.get(),bank.get(),latlong.get(), usp.get(), facttable.get(),prj_name.get(),prj_desp.get(),specification.get(),builder.get(),tco.get(),brochure.get(),prj_deactivation.get(),np.get(),np2.get(), inventory.get(), np_refresh.get(), count))
def reset():
phase_and_tower.set("")
saleable_mapping.set("")
floor_plans.set("")
options.set("")
images.set("")
video.set("")
date.set("")
amenities.set("")
prj_deactivation.set("")
inventory.set("")
np2.set("")
bank.set("")
latlong.set("")
usp.set("")
facttable.set("")
prj_name.set("")
prj_desp.set("")
specification.set("")
builder.set("")
tco.set("")
np.set("")
cons.set("")
brochure.set("")
agent_text.set("")
queue_text.set("")
np_refresh.set("")
query_text.set("")
ticket_text.set("")
def download():
conn = sqlite3.connect("OtrsSummary.db")
curs = conn.cursor()
data = curs.execute("select * from otrs")
m_dict = list(data.fetchall())
print(m_dict)
filename = "Productivity.csv"
with open("./"+filename,'w') as csvfile:
csvfile = csv.writer(csvfile, m_dict)
#csvfile.writerow(titleRow)
csvfile.writerow(["id","Date","TicketNumber","Agent","QueryReply","Queue","PhasesandTowers","SaleableMapping","Floorplan","Options","Images","ConstructionImages","video","PossessionDate","Amenities","Bank","Location","USP","FactTable","ProjectName","Description","Specificaton","Builder","TCO","Brochure","ProjectDeactivation","NPDeactivation","NewBooking","XID Number","np_refresh","Total"])
for i in range(0, len( m_dict )):
#print(alldata1[i])
csvfile.writerow( m_dict[i] )
localtime = time.asctime(time.localtime(time.time()))
fdate = date.today()
lblInfo = Label(Tops, font=("arial", 30, "bold"), text="OTRS Management System", fg="SteelBlue4", bd=10)
lblInfo.grid(row=0, column=0)
lblInfo = Label(Tops, font=("arial", 30, "bold"), text=localtime, fg="IndianRed1",bd=10)
lblInfo.grid(row=0, column=1)
#===============================All Functions===================
#===========================#first part=======================
phase_and_tower = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Phases and Tower", bd=8, anchor="w")
lblname2.grid(row=1, column=0, sticky=W)
txtname1 = OptionMenu(f1aa, phase_and_tower, *field)
txtname1.grid(row=1, column=1, sticky=W)
saleable_mapping = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Saleable Mapping", bd=8, anchor="w")
lblname2.grid(row=2, column=0, sticky=W)
txtname2 = OptionMenu(f1aa, saleable_mapping, *field)
txtname2.grid(row=2, column=1, sticky=W)
floor_plans = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Floor Plan", bd=8, anchor="w")
lblname2.grid(row=3, column=0, sticky=W)
txtname3 = OptionMenu(f1aa, floor_plans, *field)
txtname3.grid(row=3, column=1, sticky=W)
options = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Options", bd=8, anchor="w")
lblname2.grid(row=4, column=0, sticky=W)
txtname4 = OptionMenu(f1aa, options, *field)
txtname4.grid(row=4, column=1, sticky=W)
images = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Images", bd=8, anchor="w")
lblname2.grid(row=5, column=0, sticky=W)
txtname5 = OptionMenu(f1aa, images, *field)
txtname5.grid(row=5, column=1, sticky=W)
video = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Video", bd=8, anchor="w")
lblname2.grid(row=6, column=0, sticky=W)
txtname6 = OptionMenu(f1aa, video, *field)
txtname6.grid(row=6, column=1, sticky=W)
##rera = StringVar()
##lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Rera", bd=8, anchor="w")
##lblname2.grid(row=7, column=0, sticky=W)
##txtname7 = Entry(f1aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=rera)
##txtname7.grid(row=7, column=1, sticky=W)
date = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Possession Status/Date", bd=8, anchor="w")
lblname2.grid(row=8, column=0, sticky=W)
txtname8 = OptionMenu(f1aa, date, *field)
txtname8.grid(row=8, column=1, sticky=W)
amenities = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Amenities", bd=8, anchor="w")
lblname2.grid(row=9, column=0, sticky=W)
txtname9 = OptionMenu(f1aa, amenities, *field)
txtname9.grid(row=9, column=1, sticky=W)
prj_deactivation = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Project Deactivation", bd=8, anchor="w")
lblname2.grid(row=10, column=0, sticky=W)
txtname10 = OptionMenu(f1aa, prj_deactivation, *field)
txtname10.grid(row=10, column=1, sticky=W)
inventory = StringVar()
lblname2 = Label(f2ab, font=("arial", 10, "bold"), text="XID Number", bd=8, anchor="w")
lblname2.grid(row=1, column=1, sticky=W)
txtname11 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=inventory)
txtname11.grid(row=1, column=2, sticky=W)
np2 = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="New Booking/Resale Lock", bd=8, anchor="w")
lblname2.grid(row=12, column=0, sticky=W)
txtname12 = OptionMenu(f1aa, np2, *field)
txtname12.grid(row=12, column=1, sticky=W)
query_text = StringVar()
lblname = Label(f1aa, font=("arial", 10, "bold"), text="Query/Reply", bd=8, anchor="w")
lblname.grid(row=0, column=0, sticky=W)
txtname28 = OptionMenu(f1aa, query_text, *field)
txtname28.grid(row=0, column=1, sticky=W)
hidden = False
hidden_text = StringVar()
e = Entry(f1aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = hidden_text)
e.grid(row=0, column=2)
if query_text == "YES":
e.grid()
else:
e.grid_remove()
#hidden = not hidden
#######################################part2=====================
bank = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Bank", bd=8, anchor="w")
lblname2.grid(row=1, column=0, sticky=W)
txtname13 = OptionMenu(f1ab, bank, *field)
txtname13.grid(row=1, column=1, sticky=W)
latlong = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Lat Long/Location", bd=8, anchor="w")
lblname2.grid(row=2, column=0, sticky=W)
txtname14 = OptionMenu(f1ab, latlong, *field)
txtname14.grid(row=2, column=1, sticky=W)
usp = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="USP", bd=8, anchor="w")
lblname2.grid(row=3, column=0, sticky=W)
txtname15 = OptionMenu(f1ab, usp, *field)
txtname15.grid(row=3, column=1, sticky=W)
facttable = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Fact Table", bd=8, anchor="w")
lblname2.grid(row=4, column=0, sticky=W)
txtname16 = OptionMenu(f1ab, facttable, *field)
txtname16.grid(row=4, column=1, sticky=W)
prj_name = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Project Name", bd=8, anchor="w")
lblname2.grid(row=5, column=0, sticky=W)
txtname17 = OptionMenu(f1ab, prj_name, *field)
txtname17.grid(row=5, column=1, sticky=W)
prj_desp = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Project Description", bd=8, anchor="w")
lblname2.grid(row=6, column=0, sticky=W)
txtname18 = OptionMenu(f1ab, prj_desp, *field)
txtname18.grid(row=6, column=1, sticky=W)
specification = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Project Specification", bd=8, anchor="w")
lblname2.grid(row=7, column=0, sticky=W)
txtname19 = OptionMenu(f1ab, specification, *field)
txtname19.grid(row=7, column=1, sticky=W)
builder = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Builer Details", bd=8, anchor="w")
lblname2.grid(row=8, column=0, sticky=W)
txtname20 = OptionMenu(f1ab, builder, *field)
txtname20.grid(row=8, column=1, sticky=W)
tco = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="TCO/Payment Plan", bd=8, anchor="w")
lblname2.grid(row=9, column=0, sticky=W)
txtname21 = OptionMenu(f1ab, tco, *field)
txtname21.grid(row=9, column=1, sticky=W)
np = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="NP Deactivation", bd=8, anchor="w")
lblname2.grid(row=10, column=0, sticky=W)
txtname22 = OptionMenu(f1ab, np, *field)
txtname22.grid(row=10, column=1, sticky=W)
cons = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Construction Images", bd=8, anchor="w")
lblname2.grid(row=11, column=0, sticky=W)
txtname23 = OptionMenu(f1ab, cons, *field)
txtname23.grid(row=11, column=1, sticky=W)
brochure = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Brochure", bd=8, anchor="w")
lblname2.grid(row=12, column=0, sticky=W)
txtname24 = OptionMenu(f1ab, brochure, *field)
txtname24.grid(row=12, column=1, sticky=W)
###======EntryWidget for checkboxes=======
#==================for Reset======================
list1=Listbox(ft2, height=22,width=59)
list1.grid(row=2,column=0,rowspan=6,columnspan=2)
sb1=Scrollbar(ft2)
sb1.grid(row=2,column=2,rowspan=6)
list1.configure(yscrollcommand=sb1.set)
sb1.configure(command=list1.yview)
list1.bind('<<ListboxSelect>>')
lblreceipt = Label(ft2, font=("arial", 12, "bold"), text="View Data", bd=2, anchor="w")
lblreceipt.grid(row=1, column=0, sticky=W)
##txtReceipt = Text(ft2, width=59, height=22, bg="white", bd=8, font=("arial", 11, "bold"))
##txtReceipt.grid(row=2, column=0)
##########buttons########################
btnReset = Button(fb2, padx=16,pady=1,bd=4, fg="black", font=("arial", 8, "bold"),width=5,
text="Reset", command=reset).grid(row=0, column=1)
btnSubmit = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
text="Submit", command=add_command).grid(row=0, column=2)
btnExit = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
text="Exit", command=root.destroy).grid(row=0, column=4)
btnview = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
text="View Data", command=view_command).grid(row=0, column=3)
download = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
text="Download Data", command=download).grid(row=1, column=1)
########################################################################################
ticket_text = StringVar()
lblname2 = Label(f2aa, font=("arial", 10, "bold"), text="Ticket Number", bd=8, anchor="w")
lblname2.grid(row=1, column=0, sticky=W)
txtname25 = Entry(f2aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=ticket_text)
txtname25.grid(row=1, column=1, sticky=W)
##xid_text = StringVar()
##lblname3 = Label(f2aa, font=("arial", 10, "bold"), text="XID/TID", bd=8, anchor="w")
##lblname3.grid(row=2, column=0, sticky=W)
##txtname26 = Entry(f2aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = xid_text)
##txtname26.grid(row=2, column=1, sticky=W)
agents = ["Himani",
"Jhanvi",
"Sandhya",
"Juhi",
"Ruchika",
"Saurabh",
"Neha R",
"Shubhangi",
"Alisha",
"Priya S",
"Khushbu",
"Gaurav",
"Manisha",
"Anjali S",
"Sneha",
"Priyadeep",
"Anjali B",
"Rashi",
"Palak",
"Shivangi",
"Khyati",
"Alok",
"Vikas",
"Tariq",
"Vinay",
"Nupur",
"Mansi"]
agent_text = StringVar()
lblname4 = Label(f2aa, font=("arial", 10, "bold"), text="Agents Name", bd=8, anchor="w")
lblname4.grid(row=3, column=0, sticky=W)
txtname27 = OptionMenu(f2aa, agent_text, *agents)
txtname27.grid(row=3, column=1, sticky=W)
field1 = ["UPGRADES", "CREATION", "MODIFICATION"]
queue_text = StringVar()
lblname2 = Label(f2ab, font=("arial", 10, "bold"), text="Queue", bd=8, anchor="w")
lblname2.grid(row=0, column=1, sticky=W)
txtname29 = OptionMenu(f2ab, queue_text, *field1)
txtname29.grid(row=0, column=2, sticky=W)
np_refresh = StringVar()
lblname31 = Label(f1aa, font=("arial", 10, "bold"), text="NP Slot changes/Refresh", bd=8, anchor="w")
lblname31.grid(row=11, column=0, sticky=W)
txtname31 = OptionMenu(f1aa, np_refresh, *field)
txtname31.grid(row=11, column=1, sticky=W)
##sales_text = StringVar()
##lblname3 = Label(f2ab, font=("arial", 10, "bold"), text="Sales Name", bd=8, anchor="w")
##lblname3.grid(row=2, column=0, sticky=W)
##txtname30 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = sales_text)
##txtname30.grid(row=2, column=1, sticky=W)
##slot = StringVar()
##lblname2 = Label(f2ab, font=("arial",10,"bold"), text="NP Slot", bd=8, anchor="w")
##lblname2.grid(row=0, column=3, sticky=W)
##txtname31 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=slot)
##txtname31.grid(row=0, column=4, sticky=W)
##city = StringVar()
##lblname5 = Label(f2ab, font=("arial", 10, "bold"), text="Main City", bd=8, anchor="w")
##lblname5.grid(row=1, column=3, sticky=W)
##txtname32 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = city)
##txtname32.grid(row=1, column=4, sticky=W)
##comments = StringVar()
##lblname6 = Label(f2ab, font=("arial", 10, "bold"), text="Comments", bd=8, anchor="w")
##lblname6.grid(row=2, column=3, sticky=W)
##txtname33 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = comments)
##txtname33.grid(row=2, column=4, sticky=W)
##############====connecting db with fromntend====
root.mainloop()
I have added full codes
You have to make sure that the logic to show or hide the Entry box is executed every time the OptionMenu selection is changed. You can do this by putting it in a function and using the OptionMenu's command parameter:
from tkinter import *
root = Tk()
def hide(choice):
if choice == "YES":
e.grid()
else:
e.grid_remove()
field = ["YES",""]
query_text = StringVar()
lblname = Label(root, font=("arial", 10, "bold"), text="Query/Reply", bd=8, anchor="w")
lblname.grid(row=0, column=0, sticky=W)
txtname28 = OptionMenu(root, query_text, *field, command=hide)
txtname28.grid(row=0, column=1, sticky=W)
hidden_text = StringVar()
hidden_text.set('Show this text?')
e = Entry(root, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = hidden_text)
e.grid(row=0, column=2)
root.mainloop()
What you want to do is replace your root.mainloop() with a custom loop you made yourself that incorporated your if statement in it. As you have it right now, that is statement is only going to be called once, and that's before you GUI even becomes operational. Instead of checking to see if the value has changed just once at the beginning, to need to make it keep checking all the time.
Checking when things are happening all the time is what root.mainloop() does, but what you need is beyond what root.mainloop() does. So what you need is a loop you made yourself (as I was saying above) that can check when the value has changed and update the GUI accordingly.
In your loop, you'll need to also make sure that your GUI is still responding manually. This is usually done by root.mainloop(), but since you need to replace it, you need to do it yourself. There are a bunch of ways to do this, but start off by looking into root.update() and putting that in your own loop.
EDIT: Actually, have you considered using a check box instead of a drop down menu? You can attack a function to it and make it show or hide the widget when you press it. Also you should consider enabling and disabling the widget rather than hiding or showing it. This will mean less problem with the layout

Evenly color graph in ruby

Please let me know the problem in the code that I implemented.
Problem Statement: There are n nodes and m colors to be filled in a Graph g. Assign colors to the nodes such that no two adjacent nodes have same colors and try to evenly distribute the colors among the nodes.
Approach: I am using dfs along with greedy algorithm(to evenly distribute)
Variables: $G is graph of the form: {v1: [v2, v3, v4], v2: [v4, v8], ...};
vertex is the starting vertex of the graph; visited_arr or adj_visited_arr is hash of the form: {v1: "1", v2: "2", ...} where "1", "2", ..., "6" are colors; frequency is hash which keeps the count of the number of times the color has been used in the graph so far. eg.: {"1": 5, "2": 6, "3": 8, ...}
Code:
def dfs(vertex, original_visited_arr, frequency)
#original_visited_arr is passed as reference
visited_arr = original_visited_arr.clone
#sorting colors frequency for evenly distribution
frequency = frequency.sort_by {|k, v| v}.to_h
used_colors = []
$G[vertex].each do |adj_vertex|
used_colors << visited_arr[adj_vertex]
end
#checking the colors which can be used (total colors-colors used by adjacent nodes)
available_colors = frequency.keys-used_colors
#if there is no color available to be filled in the node, backtrack!
if available_colors.length==0
return nil
end
#iterate through the available colors to check which one solves the problem
available_colors.each do |color|
visited_arr[vertex] = color
frequency[color]+=1
res = true
#use recursion over each node that is adjacent to the current node
$G[vertex].each do |adj_vertex|
if visited_arr[adj_vertex]=="0"
adj_vertex_visited_arr = dfs(adj_vertex, visited_arr, frequency)
if !adj_vertex_visited_arr
res=false
break
end
visited_arr=adj_vertex_visited_arr
end
end
if res
return visited_arr
end
frequency[color]-=1
visited_arr[vertex] = "0"
end
return nil
end
visited_arr = {}
frequency = {"1" => 0, "2" => 0, "3" => 0, "4" => 0, "5" => 0, "6" => 0}
visited_arr = dfs(vertex, visited_arr, frequency)
Values:
vertex="TRIP-10065"
vertices=["TRIP-10065", "TRIP-10066", "TRIP-10067", "TRIP-10068", "TRIP-10069", "TRIP-10070", "TRIP-10071", "TRIP-10072", "TRIP-10073", "TRIP-10074", "TRIP-10075", "TRIP-10076", "TRIP-10077", "TRIP-10078", "TRIP-10079", "TRIP-10080", "TRIP-10081", "TRIP-10082", "TRIP-10083", "TRIP-10084", "TRIP-10085", "TRIP-10086", "TRIP-10087", "TRIP-10088", "TRIP-10089", "TRIP-10090", "TRIP-10091", "TRIP-10092", "TRIP-10093", "TRIP-10094", "TRIP-10095", "TRIP-10096", "TRIP-10097", "TRIP-10098", "TRIP-10099", "TRIP-10100", "TRIP-10101", "TRIP-10102", "TRIP-10103", "TRIP-10104", "TRIP-10105", "TRIP-10106", "TRIP-10107", "TRIP-10108", "TRIP-10109", "TRIP-10110", "TRIP-10111", "TRIP-10112", "TRIP-10113", "TRIP-10114", "TRIP-10115", "TRIP-10116", "TRIP-10117", "TRIP-10118", "TRIP-10119", "TRIP-10120", "TRIP-10121", "TRIP-10122", "TRIP-10123", "TRIP-10124", "TRIP-10125", "TRIP-10126", "TRIP-10127", "TRIP-10128", "TRIP-10129", "TRIP-10130", "TRIP-10131", "TRIP-10132", "TRIP-10133", "TRIP-10134", "TRIP-10135", "TRIP-10136", "TRIP-10137", "TRIP-10138", "TRIP-10139", "TRIP-10140", "TRIP-10141", "TRIP-10142", "TRIP-10143", "TRIP-10144", "TRIP-10145", "TRIP-10146", "TRIP-10147", "TRIP-10148", "TRIP-10149", "TRIP-10150", "TRIP-10151", "TRIP-10152", "TRIP-10153", "TRIP-10154", "TRIP-10155", "TRIP-10156", "TRIP-10157", "TRIP-10158", "TRIP-10159", "TRIP-10160", "TRIP-10161", "TRIP-10162", "TRIP-10163", "TRIP-10164", "TRIP-10165", "TRIP-10166", "TRIP-10167", "TRIP-10168", "TRIP-10169", "TRIP-10170", "TRIP-10171", "TRIP-10172", "TRIP-10173", "TRIP-10174", "TRIP-10175", "TRIP-10176", "TRIP-10177", "TRIP-10178", "TRIP-10179", "TRIP-10180", "TRIP-10181", "TRIP-10182", "TRIP-10183", "TRIP-10184", "TRIP-10185", "TRIP-10186", "TRIP-10187"]
$G={"TRIP-10122"=>["TRIP-10157", "TRIP-10158", "TRIP-10168", "TRIP-10159", "TRIP-10169", "TRIP-10178", "TRIP-10179"], "TRIP-10091"=>["TRIP-10111", "TRIP-10148", "TRIP-10141", "TRIP-10139", "TRIP-10147", "TRIP-10088", "TRIP-10089"], "TRIP-10119"=>["TRIP-10168", "TRIP-10167", "TRIP-10155", "TRIP-10178", "TRIP-10157", "TRIP-10176", "TRIP-10179"], "TRIP-10118"=>["TRIP-10167", "TRIP-10168", "TRIP-10155", "TRIP-10176", "TRIP-10157", "TRIP-10178", "TRIP-10177"], "TRIP-10125"=>["TRIP-10169", "TRIP-10170", "TRIP-10171", "TRIP-10158", "TRIP-10180", "TRIP-10181", "TRIP-10156"], "TRIP-10097"=>["TRIP-10112", "TRIP-10148", "TRIP-10142", "TRIP-10150", "TRIP-10089", "TRIP-10149", "TRIP-10140"], "TRIP-10136"=>["TRIP-10153", "TRIP-10184", "TRIP-10165", "TRIP-10183", "TRIP-10175", "TRIP-10185", "TRIP-10173"], "TRIP-10130"=>["TRIP-10164", "TRIP-10171", "TRIP-10183", "TRIP-10172", "TRIP-10163", "TRIP-10184", "TRIP-10186"], "TRIP-10068"=>["TRIP-10070", "TRIP-10067", "TRIP-10069", "TRIP-10086", "TRIP-10083", "TRIP-10074", "TRIP-10087"], "TRIP-10094"=>["TRIP-10112", "TRIP-10141", "TRIP-10149", "TRIP-10140", "TRIP-10114", "TRIP-10142", "TRIP-10151"], "TRIP-10067"=>["TRIP-10086", "TRIP-10069", "TRIP-10068", "TRIP-10070", "TRIP-10071", "TRIP-10072", "TRIP-10073"], "TRIP-10103"=>["TRIP-10116", "TRIP-10144", "TRIP-10151", "TRIP-10152", "TRIP-10177", "TRIP-10176", "TRIP-10114"], "TRIP-10088"=>["TRIP-10082", "TRIP-10139", "TRIP-10084", "TRIP-10086", "TRIP-10091", "TRIP-10111", "TRIP-10087"], "TRIP-10144"=>["TRIP-10103", "TRIP-10151", "TRIP-10152", "TRIP-10102", "TRIP-10104", "TRIP-10114", "TRIP-10116"], "TRIP-10073"=>["TRIP-10072", "TRIP-10071", "TRIP-10066", "TRIP-10074", "TRIP-10078", "TRIP-10083", "TRIP-10067"], "TRIP-10137"=>["TRIP-10138", "TRIP-10065", "TRIP-10145", "TRIP-10175", "TRIP-10107", "TRIP-10090", "TRIP-10101"], "TRIP-10072"=>["TRIP-10078", "TRIP-10073", "TRIP-10071", "TRIP-10066", "TRIP-10074", "TRIP-10083", "TRIP-10067"], "TRIP-10128"=>["TRIP-10160", "TRIP-10182", "TRIP-10161", "TRIP-10181", "TRIP-10170", "TRIP-10171", "TRIP-10184", "TRIP-10172", "TRIP-10109", "TRIP-10158", "TRIP-10110", "TRIP-10183"], "TRIP-10158"=>["TRIP-10126", "TRIP-10122", "TRIP-10180", "TRIP-10125", "TRIP-10181", "TRIP-10168", "TRIP-10124", "TRIP-10179", "TRIP-10170", "TRIP-10169", "TRIP-10128", "TRIP-10171"], "TRIP-10092"=>["TRIP-10141", "TRIP-10112", "TRIP-10139", "TRIP-10148", "TRIP-10089", "TRIP-10147", "TRIP-10132", "TRIP-10160", "TRIP-10140", "TRIP-10111", "TRIP-10114", "TRIP-10142"], "TRIP-10161"=>["TRIP-10127", "TRIP-10184", "TRIP-10181", "TRIP-10128", "TRIP-10108", "TRIP-10120", "TRIP-10110", "TRIP-10145", "TRIP-10183", "TRIP-10171", "TRIP-10182", "TRIP-10172"], "TRIP-10153"=>["TRIP-10185", "TRIP-10146", "TRIP-10127", "TRIP-10145", "TRIP-10136", "TRIP-10184", "TRIP-10107", "TRIP-10138", "TRIP-10110", "TRIP-10175", "TRIP-10129", "TRIP-10173"], "TRIP-10083"=>["TRIP-10082", "TRIP-10085", "TRIP-10068", "TRIP-10086", "TRIP-10070", "TRIP-10084", "TRIP-10076", "TRIP-10081", "TRIP-10072", "TRIP-10073", "TRIP-10078", "TRIP-10069"], "TRIP-10112"=>["TRIP-10094", "TRIP-10097", "TRIP-10092", "TRIP-10140", "TRIP-10149", "TRIP-10089", "TRIP-10150", "TRIP-10096", "TRIP-10148", "TRIP-10093", "TRIP-10139", "TRIP-10142"], "TRIP-10173"=>["TRIP-10131", "TRIP-10165", "TRIP-10133", "TRIP-10134", "TRIP-10132", "TRIP-10162", "TRIP-10127", "TRIP-10182", "TRIP-10185", "TRIP-10184", "TRIP-10136", "TRIP-10153"], "TRIP-10168"=>["TRIP-10121", "TRIP-10119", "TRIP-10118", "TRIP-10120", "TRIP-10157", "TRIP-10122", "TRIP-10158", "TRIP-10178", "TRIP-10176", "TRIP-10156", "TRIP-10179", "TRIP-10155"], "TRIP-10116"=>["TRIP-10104", "TRIP-10103", "TRIP-10109", "TRIP-10155", "TRIP-10152", "TRIP-10176", "TRIP-10177", "TRIP-10154", "TRIP-10178", "TRIP-10106", "TRIP-10144", "TRIP-10179"], "TRIP-10070"=>["TRIP-10068", "TRIP-10079", "TRIP-10080", "TRIP-10067", "TRIP-10069", "TRIP-10086", "TRIP-10083", "TRIP-10084", "TRIP-10074", "TRIP-10078", "TRIP-10087", "TRIP-10085"], "TRIP-10114"=>["TRIP-10096", "TRIP-10099", "TRIP-10151", "TRIP-10144", "TRIP-10102", "TRIP-10143", "TRIP-10103", "TRIP-10152", "TRIP-10094", "TRIP-10142", "TRIP-10092", "TRIP-10148"], "TRIP-10181"=>["TRIP-10161", "TRIP-10126", "TRIP-10160", "TRIP-10124", "TRIP-10125", "TRIP-10158", "TRIP-10128", "TRIP-10170", "TRIP-10171", "TRIP-10100", "TRIP-10120", "TRIP-10156"], "TRIP-10148"=>["TRIP-10142", "TRIP-10139", "TRIP-10097", "TRIP-10091", "TRIP-10092", "TRIP-10089", "TRIP-10093", "TRIP-10096", "TRIP-10112", "TRIP-10111", "TRIP-10113", "TRIP-10114"], "TRIP-10167"=>["TRIP-10118", "TRIP-10155", "TRIP-10119", "TRIP-10117", "TRIP-10154", "TRIP-10157", "TRIP-10176", "TRIP-10123", "TRIP-10160", "TRIP-10177", "TRIP-10179", "TRIP-10178"], "TRIP-10157"=>["TRIP-10122", "TRIP-10178", "TRIP-10106", "TRIP-10176", "TRIP-10118", "TRIP-10121", "TRIP-10179", "TRIP-10168", "TRIP-10119", "TRIP-10167", "TRIP-10169", "TRIP-10177"], "TRIP-10139"=>["TRIP-10148", "TRIP-10088", "TRIP-10149", "TRIP-10147", "TRIP-10092", "TRIP-10087", "TRIP-10086", "TRIP-10093", "TRIP-10091", "TRIP-10096", "TRIP-10112", "TRIP-10111"], "TRIP-10155"=>["TRIP-10167", "TRIP-10176", "TRIP-10179", "TRIP-10106", "TRIP-10117", "TRIP-10118", "TRIP-10119", "TRIP-10178", "TRIP-10177", "TRIP-10109", "TRIP-10116", "TRIP-10168"], "TRIP-10145"=>["TRIP-10127", "TRIP-10153", "TRIP-10108", "TRIP-10163", "TRIP-10161", "TRIP-10137", "TRIP-10175", "TRIP-10105", "TRIP-10146", "TRIP-10110", "TRIP-10115", "TRIP-10106"], "TRIP-10163"=>["TRIP-10115", "TRIP-10183", "TRIP-10108", "TRIP-10145", "TRIP-10129", "TRIP-10172", "TRIP-10130", "TRIP-10184", "TRIP-10105", "TRIP-10175", "TRIP-10106", "TRIP-10127"], "TRIP-10111"=>["TRIP-10091", "TRIP-10088", "TRIP-10141", "TRIP-10089", "TRIP-10147", "TRIP-10087", "TRIP-10139", "TRIP-10148", "TRIP-10093", "TRIP-10092"], "TRIP-10117"=>["TRIP-10106", "TRIP-10109", "TRIP-10155", "TRIP-10156", "TRIP-10179", "TRIP-10177", "TRIP-10167", "TRIP-10154", "TRIP-10178", "TRIP-10176"], "TRIP-10132"=>["TRIP-10106", "TRIP-10174", "TRIP-10162", "TRIP-10182", "TRIP-10160", "TRIP-10092", "TRIP-10173", "TRIP-10172", "TRIP-10100", "TRIP-10166"], "TRIP-10134"=>["TRIP-10165", "TRIP-10164", "TRIP-10174", "TRIP-10166", "TRIP-10185", "TRIP-10173", "TRIP-10183", "TRIP-10184", "TRIP-10186", "TRIP-10172"], "TRIP-10087"=>["TRIP-10086", "TRIP-10089", "TRIP-10147", "TRIP-10139", "TRIP-10088", "TRIP-10111", "TRIP-10068", "TRIP-10070", "TRIP-10082", "TRIP-10084"], "TRIP-10156"=>["TRIP-10180", "TRIP-10179", "TRIP-10121", "TRIP-10117", "TRIP-10125", "TRIP-10169", "TRIP-10100", "TRIP-10120", "TRIP-10181", "TRIP-10168"], "TRIP-10129"=>["TRIP-10105", "TRIP-10163", "TRIP-10172", "TRIP-10165", "TRIP-10175", "TRIP-10164", "TRIP-10183", "TRIP-10153", "TRIP-10185", "TRIP-10110"], "TRIP-10085"=>["TRIP-10081", "TRIP-10089", "TRIP-10076", "TRIP-10082", "TRIP-10083", "TRIP-10078", "TRIP-10084", "TRIP-10080", "TRIP-10070", "TRIP-10066"], "TRIP-10082"=>["TRIP-10088", "TRIP-10084", "TRIP-10083", "TRIP-10085", "TRIP-10086", "TRIP-10077", "TRIP-10079", "TRIP-10069", "TRIP-10087", "TRIP-10078"], "TRIP-10140"=>["TRIP-10149", "TRIP-10112", "TRIP-10094", "TRIP-10093", "TRIP-10113", "TRIP-10092", "TRIP-10097", "TRIP-10150", "TRIP-10096", "TRIP-10147"], "TRIP-10076"=>["TRIP-10075", "TRIP-10085", "TRIP-10074", "TRIP-10078", "TRIP-10071", "TRIP-10083", "TRIP-10080", "TRIP-10175", "TRIP-10084", "TRIP-10066"], "TRIP-10121"=>["TRIP-10168", "TRIP-10156", "TRIP-10179", "TRIP-10157", "TRIP-10169"], "TRIP-10098"=>["TRIP-10143", "TRIP-10113", "TRIP-10150", "TRIP-10141", "TRIP-10142"], "TRIP-10107"=>["TRIP-10131", "TRIP-10138", "TRIP-10153", "TRIP-10137", "TRIP-10090"], "TRIP-10133"=>["TRIP-10175", "TRIP-10162", "TRIP-10173", "TRIP-10182", "TRIP-10174"], "TRIP-10099"=>["TRIP-10143", "TRIP-10114", "TRIP-10151", "TRIP-10113", "TRIP-10141", "TRIP-10150"], "TRIP-10108"=>["TRIP-10115", "TRIP-10145", "TRIP-10163", "TRIP-10120", "TRIP-10161", "TRIP-10127"], "TRIP-10104"=>["TRIP-10116", "TRIP-10177", "TRIP-10152", "TRIP-10144", "TRIP-10154", "TRIP-10178"], "TRIP-10100"=>["TRIP-10120", "TRIP-10156", "TRIP-10181", "TRIP-10132", "TRIP-10166", "TRIP-10182"], "TRIP-10090"=>["TRIP-10065", "TRIP-10101", "TRIP-10110", "TRIP-10107", "TRIP-10137", "TRIP-10138"], "TRIP-10186"=>["TRIP-10135", "TRIP-10174", "TRIP-10130", "TRIP-10172", "TRIP-10134", "TRIP-10166"], "TRIP-10066"=>["TRIP-10071", "TRIP-10072", "TRIP-10073", "TRIP-10076", "TRIP-10078", "TRIP-10085"], "TRIP-10138"=>["TRIP-10137", "TRIP-10065", "TRIP-10107", "TRIP-10153", "TRIP-10090", "TRIP-10101"], "TRIP-10126"=>["TRIP-10158", "TRIP-10160", "TRIP-10181", "TRIP-10171"], "TRIP-10146"=>["TRIP-10153", "TRIP-10185", "TRIP-10145", "TRIP-10110"], "TRIP-10101"=>["TRIP-10090", "TRIP-10071", "TRIP-10137", "TRIP-10138"], "TRIP-10135"=>["TRIP-10186", "TRIP-10174", "TRIP-10166", "TRIP-10185"], "TRIP-10102"=>["TRIP-10143", "TRIP-10151", "TRIP-10144", "TRIP-10114"], "TRIP-10077"=>["TRIP-10079", "TRIP-10078", "TRIP-10082", "TRIP-10069"], "TRIP-10141"=>["TRIP-10092", "TRIP-10149", "TRIP-10150", "TRIP-10091", "TRIP-10093", "TRIP-10147", "TRIP-10187", "TRIP-10094", "TRIP-10098", "TRIP-10099", "TRIP-10113", "TRIP-10096", "TRIP-10111"], "TRIP-10096"=>["TRIP-10114", "TRIP-10142", "TRIP-10150", "TRIP-10113", "TRIP-10141", "TRIP-10143", "TRIP-10089", "TRIP-10112", "TRIP-10148", "TRIP-10139", "TRIP-10149", "TRIP-10140", "TRIP-10151"], "TRIP-10113"=>["TRIP-10098", "TRIP-10142", "TRIP-10150", "TRIP-10099", "TRIP-10141", "TRIP-10093", "TRIP-10140", "TRIP-10096", "TRIP-10143", "TRIP-10095", "TRIP-10149", "TRIP-10148", "TRIP-10147"], "TRIP-10171"=>["TRIP-10130", "TRIP-10124", "TRIP-10125", "TRIP-10123", "TRIP-10160", "TRIP-10181", "TRIP-10128", "TRIP-10161", "TRIP-10182", "TRIP-10184", "TRIP-10120", "TRIP-10126", "TRIP-10158"], "TRIP-10089"=>["TRIP-10187", "TRIP-10085", "TRIP-10087", "TRIP-10147", "TRIP-10092", "TRIP-10097", "TRIP-10148", "TRIP-10112", "TRIP-10149", "TRIP-10093", "TRIP-10091", "TRIP-10111", "TRIP-10096"], "TRIP-10177"=>["TRIP-10104", "TRIP-10106", "TRIP-10152", "TRIP-10103", "TRIP-10117", "TRIP-10155", "TRIP-10154", "TRIP-10116", "TRIP-10123", "TRIP-10160", "TRIP-10167", "TRIP-10118", "TRIP-10157"], "TRIP-10182"=>["TRIP-10133", "TRIP-10162", "TRIP-10132", "TRIP-10128", "TRIP-10160", "TRIP-10174", "TRIP-10173", "TRIP-10161", "TRIP-10171", "TRIP-10172", "TRIP-10109", "TRIP-10100", "TRIP-10166"], "TRIP-10095"=>["TRIP-10142", "TRIP-10150", "TRIP-10113"], "TRIP-10065"=>["TRIP-10090", "TRIP-10137", "TRIP-10138"], "TRIP-10187"=>["TRIP-10089", "TRIP-10141", "TRIP-10147"], "TRIP-10124"=>["TRIP-10170", "TRIP-10171", "TRIP-10160", "TRIP-10181", "TRIP-10158", "TRIP-10180", "TRIP-10106", "TRIP-10176"], "TRIP-10143"=>["TRIP-10098", "TRIP-10099", "TRIP-10150", "TRIP-10102", "TRIP-10151", "TRIP-10096", "TRIP-10113", "TRIP-10114"], "TRIP-10162"=>["TRIP-10133", "TRIP-10132", "TRIP-10131", "TRIP-10182", "TRIP-10174", "TRIP-10173", "TRIP-10172", "TRIP-10185"], "TRIP-10071"=>["TRIP-10066", "TRIP-10101", "TRIP-10072", "TRIP-10073", "TRIP-10075", "TRIP-10076", "TRIP-10175", "TRIP-10067"], "TRIP-10074"=>["TRIP-10078", "TRIP-10075", "TRIP-10076", "TRIP-10072", "TRIP-10073", "TRIP-10068", "TRIP-10070", "TRIP-10086"], "TRIP-10075"=>["TRIP-10076", "TRIP-10074", "TRIP-10078", "TRIP-10080", "TRIP-10081", "TRIP-10071", "TRIP-10084", "TRIP-10175"], "TRIP-10081"=>["TRIP-10085", "TRIP-10079", "TRIP-10078", "TRIP-10075", "TRIP-10080", "TRIP-10083", "TRIP-10084", "TRIP-10069"], "TRIP-10159"=>["TRIP-10179", "TRIP-10178", "TRIP-10123", "TRIP-10170", "TRIP-10180", "TRIP-10176", "TRIP-10169", "TRIP-10122"], "TRIP-10079"=>["TRIP-10077", "TRIP-10070", "TRIP-10081", "TRIP-10080", "TRIP-10078", "TRIP-10082", "TRIP-10069", "TRIP-10084"], "TRIP-10180"=>["TRIP-10156", "TRIP-10158", "TRIP-10125", "TRIP-10123", "TRIP-10159", "TRIP-10124", "TRIP-10170", "TRIP-10169"], "TRIP-10170"=>["TRIP-10125", "TRIP-10124", "TRIP-10123", "TRIP-10159", "TRIP-10181", "TRIP-10128", "TRIP-10158", "TRIP-10180"], "TRIP-10152"=>["TRIP-10103", "TRIP-10144", "TRIP-10106", "TRIP-10177", "TRIP-10104", "TRIP-10176", "TRIP-10116", "TRIP-10114"], "TRIP-10123"=>["TRIP-10159", "TRIP-10170", "TRIP-10160", "TRIP-10171", "TRIP-10180", "TRIP-10178", "TRIP-10176", "TRIP-10169", "TRIP-10167", "TRIP-10177", "TRIP-10179"], "TRIP-10084"=>["TRIP-10082", "TRIP-10080", "TRIP-10088", "TRIP-10070", "TRIP-10083", "TRIP-10075", "TRIP-10081", "TRIP-10085", "TRIP-10087", "TRIP-10076", "TRIP-10079"], "TRIP-10093"=>["TRIP-10142", "TRIP-10141", "TRIP-10147", "TRIP-10139", "TRIP-10148", "TRIP-10113", "TRIP-10140", "TRIP-10089", "TRIP-10112", "TRIP-10149", "TRIP-10111"], "TRIP-10174"=>["TRIP-10166", "TRIP-10135", "TRIP-10132", "TRIP-10134", "TRIP-10186", "TRIP-10133", "TRIP-10162", "TRIP-10160", "TRIP-10182", "TRIP-10185", "TRIP-10184"], "TRIP-10169"=>["TRIP-10125", "TRIP-10156", "TRIP-10123", "TRIP-10159", "TRIP-10122", "TRIP-10158", "TRIP-10179", "TRIP-10121", "TRIP-10180", "TRIP-10157", "TRIP-10178"], "TRIP-10164"=>["TRIP-10134", "TRIP-10130", "TRIP-10184", "TRIP-10110", "TRIP-10131", "TRIP-10185", "TRIP-10183", "TRIP-10172", "TRIP-10105", "TRIP-10129", "TRIP-10127"], "TRIP-10149"=>["TRIP-10140", "TRIP-10139", "TRIP-10141", "TRIP-10112", "TRIP-10094", "TRIP-10089", "TRIP-10097", "TRIP-10142", "TRIP-10093", "TRIP-10096", "TRIP-10113"], "TRIP-10150"=>["TRIP-10142", "TRIP-10143", "TRIP-10141", "TRIP-10097", "TRIP-10113", "TRIP-10098", "TRIP-10095", "TRIP-10096", "TRIP-10099", "TRIP-10112", "TRIP-10140"], "TRIP-10147"=>["TRIP-10139", "TRIP-10093", "TRIP-10141", "TRIP-10187", "TRIP-10087", "TRIP-10089", "TRIP-10092", "TRIP-10091", "TRIP-10111", "TRIP-10113", "TRIP-10140"], "TRIP-10086"=>["TRIP-10067", "TRIP-10087", "TRIP-10088", "TRIP-10139", "TRIP-10082", "TRIP-10068", "TRIP-10070", "TRIP-10083", "TRIP-10074"], "TRIP-10120"=>["TRIP-10100", "TRIP-10168", "TRIP-10108", "TRIP-10161", "TRIP-10110", "TRIP-10156", "TRIP-10181", "TRIP-10183", "TRIP-10171"], "TRIP-10115"=>["TRIP-10110", "TRIP-10108", "TRIP-10105", "TRIP-10163", "TRIP-10183", "TRIP-10165", "TRIP-10145", "TRIP-10175", "TRIP-10106"], "TRIP-10069"=>["TRIP-10067", "TRIP-10068", "TRIP-10070", "TRIP-10077", "TRIP-10079", "TRIP-10082", "TRIP-10083", "TRIP-10080", "TRIP-10081"], "TRIP-10131"=>["TRIP-10173", "TRIP-10107", "TRIP-10162", "TRIP-10164", "TRIP-10165", "TRIP-10185", "TRIP-10183", "TRIP-10172", "TRIP-10184"], "TRIP-10166"=>["TRIP-10174", "TRIP-10185", "TRIP-10135", "TRIP-10134", "TRIP-10186", "TRIP-10184", "TRIP-10100", "TRIP-10132", "TRIP-10182"], "TRIP-10105"=>["TRIP-10129", "TRIP-10165", "TRIP-10115", "TRIP-10164", "TRIP-10127", "TRIP-10145", "TRIP-10163", "TRIP-10183", "TRIP-10184"], "TRIP-10109"=>["TRIP-10154", "TRIP-10117", "TRIP-10116", "TRIP-10155", "TRIP-10178", "TRIP-10128", "TRIP-10160", "TRIP-10182", "TRIP-10179"], "TRIP-10154"=>["TRIP-10109", "TRIP-10104", "TRIP-10177", "TRIP-10117", "TRIP-10167", "TRIP-10106", "TRIP-10178", "TRIP-10116", "TRIP-10179"], "TRIP-10080"=>["TRIP-10084", "TRIP-10070", "TRIP-10079", "TRIP-10075", "TRIP-10081", "TRIP-10076", "TRIP-10078", "TRIP-10085", "TRIP-10069"], "TRIP-10151"=>["TRIP-10103", "TRIP-10144", "TRIP-10102", "TRIP-10143", "TRIP-10099", "TRIP-10114", "TRIP-10096", "TRIP-10094", "TRIP-10142"], "TRIP-10142"=>["TRIP-10148", "TRIP-10093", "TRIP-10150", "TRIP-10097", "TRIP-10113", "TRIP-10095", "TRIP-10096", "TRIP-10098", "TRIP-10149", "TRIP-10112", "TRIP-10094", "TRIP-10114", "TRIP-10151", "TRIP-10092"], "TRIP-10078"=>["TRIP-10077", "TRIP-10072", "TRIP-10074", "TRIP-10079", "TRIP-10081", "TRIP-10075", "TRIP-10076", "TRIP-10080", "TRIP-10073", "TRIP-10083", "TRIP-10070", "TRIP-10085", "TRIP-10082", "TRIP-10066"], "TRIP-10106"=>["TRIP-10117", "TRIP-10132", "TRIP-10152", "TRIP-10177", "TRIP-10155", "TRIP-10157", "TRIP-10176", "TRIP-10154", "TRIP-10115", "TRIP-10145", "TRIP-10163", "TRIP-10124", "TRIP-10160", "TRIP-10116"], "TRIP-10165"=>["TRIP-10134", "TRIP-10184", "TRIP-10105", "TRIP-10173", "TRIP-10131", "TRIP-10185", "TRIP-10136", "TRIP-10183", "TRIP-10129", "TRIP-10175", "TRIP-10110", "TRIP-10115", "TRIP-10127", "TRIP-10172"], "TRIP-10110"=>["TRIP-10115", "TRIP-10090", "TRIP-10164", "TRIP-10165", "TRIP-10120", "TRIP-10161", "TRIP-10127", "TRIP-10145", "TRIP-10153", "TRIP-10183", "TRIP-10129", "TRIP-10128", "TRIP-10146", "TRIP-10185"], "TRIP-10127"=>["TRIP-10161", "TRIP-10172", "TRIP-10145", "TRIP-10153", "TRIP-10105", "TRIP-10164", "TRIP-10165", "TRIP-10173", "TRIP-10110", "TRIP-10175", "TRIP-10185", "TRIP-10184", "TRIP-10108", "TRIP-10163", "TRIP-10183"], "TRIP-10175"=>["TRIP-10133", "TRIP-10129", "TRIP-10165", "TRIP-10137", "TRIP-10145", "TRIP-10136", "TRIP-10153", "TRIP-10185", "TRIP-10127", "TRIP-10115", "TRIP-10163", "TRIP-10183", "TRIP-10071", "TRIP-10075", "TRIP-10076"], "TRIP-10160"=>["TRIP-10126", "TRIP-10181", "TRIP-10124", "TRIP-10123", "TRIP-10171", "TRIP-10128", "TRIP-10182", "TRIP-10132", "TRIP-10092", "TRIP-10174", "TRIP-10106", "TRIP-10176", "TRIP-10167", "TRIP-10177", "TRIP-10109"], "TRIP-10178"=>["TRIP-10159", "TRIP-10157", "TRIP-10123", "TRIP-10119", "TRIP-10155", "TRIP-10109", "TRIP-10154", "TRIP-10168", "TRIP-10122", "TRIP-10118", "TRIP-10117", "TRIP-10104", "TRIP-10116", "TRIP-10167", "TRIP-10169"], "TRIP-10176"=>["TRIP-10155", "TRIP-10106", "TRIP-10157", "TRIP-10152", "TRIP-10118", "TRIP-10103", "TRIP-10123", "TRIP-10159", "TRIP-10116", "TRIP-10119", "TRIP-10168", "TRIP-10117", "TRIP-10167", "TRIP-10124", "TRIP-10160"], "TRIP-10183"=>["TRIP-10115", "TRIP-10163", "TRIP-10130", "TRIP-10164", "TRIP-10136", "TRIP-10165", "TRIP-10134", "TRIP-10129", "TRIP-10131", "TRIP-10105", "TRIP-10110", "TRIP-10120", "TRIP-10161", "TRIP-10175", "TRIP-10128", "TRIP-10127"], "TRIP-10179"=>["TRIP-10159", "TRIP-10156", "TRIP-10155", "TRIP-10121", "TRIP-10117", "TRIP-10157", "TRIP-10122", "TRIP-10158", "TRIP-10168", "TRIP-10169", "TRIP-10119", "TRIP-10167", "TRIP-10123", "TRIP-10109", "TRIP-10116", "TRIP-10154"], "TRIP-10172"=>["TRIP-10127", "TRIP-10130", "TRIP-10164", "TRIP-10129", "TRIP-10163", "TRIP-10186", "TRIP-10131", "TRIP-10162", "TRIP-10185", "TRIP-10134", "TRIP-10165", "TRIP-10184", "TRIP-10128", "TRIP-10161", "TRIP-10132", "TRIP-10182"], "TRIP-10184"=>["TRIP-10165", "TRIP-10164", "TRIP-10161", "TRIP-10136", "TRIP-10153", "TRIP-10130", "TRIP-10163", "TRIP-10134", "TRIP-10105", "TRIP-10127", "TRIP-10172", "TRIP-10173", "TRIP-10128", "TRIP-10171", "TRIP-10166", "TRIP-10174", "TRIP-10131"], "TRIP-10185"=>["TRIP-10166", "TRIP-10153", "TRIP-10146", "TRIP-10131", "TRIP-10165", "TRIP-10164", "TRIP-10134", "TRIP-10136", "TRIP-10175", "TRIP-10127", "TRIP-10162", "TRIP-10172", "TRIP-10173", "TRIP-10135", "TRIP-10174", "TRIP-10129", "TRIP-10110"]}
With two changed lines (marked with # <--------------------) :
require_relative 'trips1' # contains $G={"TRIP-10122"=>...
def dfs(vertex, original_visited_arr, frequency)
puts "enters dfs with vertex=#{vertex}, vis arr=#{original_visited_arr}, frequency=#{frequency}"
return nil unless $G[vertex] # <--------------------
#original_visited_arr is passed as reference
visited_arr = original_visited_arr.clone
#sorting colors frequency for evenly distribution
frequency = frequency.sort_by {|k, v| v}.to_h
used_colors = []
# puts $G.keys.sort
$G[vertex].each do |adj_vertex|
puts "adj_vertex 1=#{adj_vertex}"
used_colors << visited_arr[adj_vertex]
end
puts "used_colors=#{used_colors}"
#checking the colors which can be used (total colors-colors used by adjacent nodes)
available_colors = frequency.keys - used_colors
puts "available_colors=#{available_colors}"
#if there is no color available to be filled in the node, backtrack!
if available_colors.length==0
return nil
end
#iterate through the available colors to check which one solves the problem
available_colors.each do |color|
puts "color=#{color}, visited_arr[vertex]=#{visited_arr[vertex].inspect}, vertex=#{vertex}"
visited_arr[vertex] = color
frequency[color]+=1
res = true
#use recursion over each node that is adjacent to the current node
$G[vertex].each do |adj_vertex|
puts "adj_vertex 2=#{adj_vertex}, visited_arr[adj_vertex]=#{visited_arr[adj_vertex].inspect}"
unless visited_arr[adj_vertex] # <--------------------
adj_vertex_visited_arr = dfs(adj_vertex, visited_arr, frequency)
puts "dfs returned #{adj_vertex_visited_arr.inspect}"
if ! adj_vertex_visited_arr
res=false
break
end
visited_arr = adj_vertex_visited_arr
end
end
puts "res=#{res}"
if res
puts "about to return #{visited_arr}"
return visited_arr
end
frequency[color] -= 1
visited_arr[vertex] = "0"
end
return nil
end
vertex="TRIP-10065"
visited_arr = {}
frequency = {"1" => 0, "2" => 0, "3" => 0, "4" => 0, "5" => 0, "6" => 0}
visited_arr = dfs(vertex, visited_arr, frequency)
and trips1 :
$G = {"TRIP-10065"=>["TRIP-10090", "TRIP-10137", "TRIP-10138"],
"TRIP-10090"=>["TRIP-10065", "TRIP-10101", "TRIP-10110", "TRIP-10107", "TRIP-10137", "TRIP-10138"],
"TRIP-10137"=>["TRIP-10138", "TRIP-10065", "TRIP-10145", "TRIP-10175", "TRIP-10107", "TRIP-10090", "TRIP-10101"],
"TRIP-10138"=>["TRIP-10137", "TRIP-10065", "TRIP-10107", "TRIP-10153", "TRIP-10090", "TRIP-10101"],
}
Execution :
$ ruby -w t.rb
enters dfs with vertex=TRIP-10065, vis arr={}, frequency={"1"=>0, "2"=>0, "3"=>0, "4"=>0, "5"=>0, "6"=>0}
adj_vertex 1=TRIP-10090
adj_vertex 1=TRIP-10137
adj_vertex 1=TRIP-10138
used_colors=[nil, nil, nil]
available_colors=["1", "2", "3", "4", "5", "6"]
color=1, visited_arr[vertex]=nil, vertex=TRIP-10065
adj_vertex 2=TRIP-10090, visited_arr[adj_vertex]=nil
enters dfs with vertex=TRIP-10090, vis arr={"TRIP-10065"=>"1"}, frequency={"1"=>1, "2"=>0, "3"=>0, "4"=>0, "5"=>0, "6"=>0}
adj_vertex 1=TRIP-10065
adj_vertex 1=TRIP-10101
...
available_colors=["1", "3", "4", "5", "6"]
color=1, visited_arr[vertex]=nil, vertex=TRIP-10090
...
color=3, visited_arr[vertex]="0", vertex=TRIP-10090
...
color=4, visited_arr[vertex]="0", vertex=TRIP-10090
adj_vertex 2=TRIP-10065, visited_arr[adj_vertex]="2"
adj_vertex 2=TRIP-10101, visited_arr[adj_vertex]=nil
...
color=5, visited_arr[vertex]="0", vertex=TRIP-10090
adj_vertex 2=TRIP-10065, visited_arr[adj_vertex]="2"
adj_vertex 2=TRIP-10101, visited_arr[adj_vertex]=nil
....
color=6, visited_arr[vertex]="0", vertex=TRIP-10090
adj_vertex 2=TRIP-10065, visited_arr[adj_vertex]="2"
adj_vertex 2=TRIP-10101, visited_arr[adj_vertex]=nil
enters dfs with vertex=TRIP-10101, vis arr={"TRIP-10065"=>"2", "TRIP-10090"=>"6"}, frequency={"1"=>0, "3"=>0, "4"=>0, "5"=>0, "6"=>1, "2"=>1}
dfs returned nil
res=false
dfs returned nil
res=false
...
It seems there is something wrong with iterating the colours :
available_colors.each do |color|
because it repeats 6 times the same processing.

Power Query does not stop loading lines after table ended

Well, my problem is basically what the title says: I have a table that retrieves data from a table in another excel file, and now, doesn't stop loading lines, well after said table ended.
The script that I have (see bellow), has another table innerjoined, but that table, also from PowerQuery, that retrieves a table from yet another excel file, loads just fine. No problems. The main one is the one that does not stop until like 3000000 lines (original table is 3000 lines).
I can't understand the problem, because this has been working just fine.
let
Origem = Excel.Workbook(File.Contents("\\SERVIDOR\Registo de defeitos\REGISTO_DEFEITOS_2016.xlsm"), null, true),
REGISTRY_Table = Origem{[Item="REGISTRY",Kind="Table"]}[Data],
#"Tipo Alterado" = Table.TransformColumnTypes(REGISTRY_Table,{{"FINDER", type text}, {"DATA", type date}, {"ORDEM FABRICO", Int64.Type}, {"REFERÊNCIA", Int64.Type}, {"LOTE", type text}, {"OPERADOR", type text}, {"PRENSA", Int64.Type}, {"TURNO", Int64.Type}, {"PRODUÇÃO TOTAL#(lf)(Nº DE PEÇAS)", Int64.Type}, {"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}, {"D", Int64.Type}, {"E", Int64.Type}, {"F", Int64.Type}, {"Z", Int64.Type}, {"L", Int64.Type}, {"M", Int64.Type}, {"N", Int64.Type}, {"O", Int64.Type}, {"P", Int64.Type}, {"QUANTIDADE DE PEÇAS OK#(lf)(PRENSA)", Int64.Type}, {"QUANTIDADE DE PEÇAS NOK#(lf)(PRENSA)", Int64.Type}, {"% DEFEITOS#(lf)(PRENSA)", type number}, {"% DETECÇÃO DE DEFEITOS#(lf)(PRENSA)", type number}, {"DATA DE INSPECÇÃO", type date}, {"QUANTIDADE DE PEÇAS VERIFICADA#(lf)(Nº DE PEÇAS)", Int64.Type}, {"TIPO DE INSPECÇÃO", type text}, {"A ", Int64.Type}, {"B ", Int64.Type}, {"C ", Int64.Type}, {"D ", Int64.Type}, {"E ", Int64.Type}, {"F ", Int64.Type}, {"Z ", Int64.Type}, {"L ", Int64.Type}, {"M ", Int64.Type}, {"N ", Int64.Type}, {"O ", Int64.Type}, {"P ", Int64.Type}, {"PEÇAS RETRABALHADAS ""OK""#(lf)(Nº DE PEÇAS)", Int64.Type}, {"LOTE#(lf)FECHADO", type text}, {"QUANTIDADE DE PEÇAS OK#(lf)(INSP. FINAL)", Int64.Type}, {"QUANTIDADE DE PEÇAS NOK#(lf)(INSP. FINAL)", Int64.Type}, {"% DEFEITOS#(lf)(INSP. FINAL)", type number}, {"QUANTIDADE DE PEÇAS OK#(lf)(FINAL)", Int64.Type}, {"QUANTIDADE DE PEÇAS NOK#(lf)(FINAL)", Int64.Type}, {"% DEFEITOS#(lf)(FINAL)", type number}, {"CONTABILIZAÇÃO DE PEÇAS", Int64.Type}, {"TESTER", Int64.Type}, {"MÊS", type text}, {"ANO", Int64.Type}, {"MÊS INSP.", type text}, {"ANO INSP.", Int64.Type}}),
#"Colunas Removidas" = Table.RemoveColumns(#"Tipo Alterado",{"TESTER"}),
#"Consultas Intercaladas" = Table.NestedJoin(#"Colunas Removidas",{"FINDER"},TabelaRegistos,{"FINDER"},"NewColumn",JoinKind.Inner),
#"Expandido NewColumn" = Table.ExpandTableColumn(#"Consultas Intercaladas", "NewColumn", {"Nº DE CAVIDADES", "PRODUÇÃO PREVISTA (nº de cargas/h)", "AJUSTE DE OBJECTIVO PRODUÇÃO PREVISTA#(lf)(nº de cargas/h)", "PRODUÇÃO TOTAL#(lf)(nº de peças)", "A ", "B ", "C ", "D ", "E ", "F ", "G ", "H ", "I ", "Z ", "PRENSA SEM PARAGEM PARA REFEIÇÕES?", "J ", "TEMPO DE PARAGEM NÃO PROGRAMADA (min)", "TEMPO DE PARAGEM PROGRAMADA (min)", "AJUSTE DE TEMPO DE TURNO#(lf)(min)", "LOTE FECHADO", "OBSERVAÇÕES", "PRODUÇÃO EFECTIVA#(lf)(nº de cargas/h)", "PERFORMANCE#(lf)(%)", "DISPONIBILIDADE#(lf)(%)", "QUALIDADE PRENSA#(lf)(%)", "QUALIDADE#(lf)(%)", "OEE OBJECTIVO#(lf)(%)", "WE OBJECTIVO#(lf)(%)", "OEE PRENSA#(lf)(%)", "OEE#(lf)(%)", "Δ OEE#(lf)(Δ%)", "WE PRENSA#(lf)(%)", "WE#(lf)(%)", "Δ WE#(lf)(Δ%)", "TEMPO DE TRABALHO DISPONÍVEL#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS PROGRAMADAS#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS NÃO PROGRAMADAS#(lf)(min)", "TEMPO DE LABORAÇÃO EFECTIVO#(lf)(min)", "EFICÁCIA DE UTILIZAÇÃO#(lf)(%)", "FINDER", "COMMENTS", "NOME MÊS", "AProg", "BProg", "CProg", "DProg", "EProg", "FProg", "GProg", "HProg", "IProg", "Zprog", "ANProg", "BNProg", "CNProg", "DNProg", "ENProg", "FNProg", "GNProg", "HNProg", "INProg", "ZNprog"}, {"Nº DE CAVIDADES", "PRODUÇÃO PREVISTA (nº de cargas/h)", "AJUSTE DE OBJECTIVO PRODUÇÃO PREVISTA#(lf)(nº de cargas/h)", "PRODUÇÃO TOTAL#(lf)(nº de peças)", "A ", "B ", "C ", "D ", "E ", "F ", "G ", "H ", "I ", "Z ", "PRENSA SEM PARAGEM PARA REFEIÇÕES?", "J ", "TEMPO DE PARAGEM NÃO PROGRAMADA (min)", "TEMPO DE PARAGEM PROGRAMADA (min)", "AJUSTE DE TEMPO DE TURNO#(lf)(min)", "LOTE FECHADO", "OBSERVAÇÕES", "PRODUÇÃO EFECTIVA#(lf)(nº de cargas/h)", "PERFORMANCE#(lf)(%)", "DISPONIBILIDADE#(lf)(%)", "QUALIDADE PRENSA#(lf)(%)", "QUALIDADE#(lf)(%)", "OEE OBJECTIVO#(lf)(%)", "WE OBJECTIVO#(lf)(%)", "OEE PRENSA#(lf)(%)", "OEE#(lf)(%)", "Δ OEE#(lf)(Δ%)", "WE PRENSA#(lf)(%)", "WE#(lf)(%)", "Δ WE#(lf)(Δ%)", "TEMPO DE TRABALHO DISPONÍVEL#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS PROGRAMADAS#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS NÃO PROGRAMADAS#(lf)(min)", "TEMPO DE LABORAÇÃO EFECTIVO#(lf)(min)", "EFICÁCIA DE UTILIZAÇÃO#(lf)(%)", "FINDER.1", "COMMENTS", "NOME MÊS", "AProg", "BProg", "CProg", "DProg", "EProg", "FProg", "GProg", "HProg", "IProg", "Zprog", "ANProg", "BNProg", "CNProg", "DNProg", "ENProg", "FNProg", "GNProg", "HNProg", "INProg", "ZNprog"}),
#"Colunas Removidas1" = Table.RemoveColumns(#"Expandido NewColumn",{"PRODUÇÃO TOTAL#(lf)(nº de peças)"}),
#"Personalizado Adicionado" = Table.AddColumn(#"Colunas Removidas1", "PRODUÇÃO TOTAL OBJECTIVO (Nº DE PEÇAS)", each [Nº DE CAVIDADES]*[#"PRODUÇÃO PREVISTA (nº de cargas/h)"]*[#"TEMPO DE TRABALHO COM PARAGENS NÃO PROGRAMADAS#(lf)(min)"]/60),
#"Tipo Alterado1" = Table.TransformColumnTypes(#"Personalizado Adicionado",{{"PRODUÇÃO TOTAL OBJECTIVO (Nº DE PEÇAS)", Int64.Type}}),
#"Trimestre Inserido" = Table.AddColumn(#"Tipo Alterado1", "TRIMESTRE", each Date.QuarterOfYear([DATA]), type number),
#"Personalizado Adicionado1" = Table.AddColumn(#"Trimestre Inserido", "PRODUÇÃO TOTAL OBJECTIVO (TEMPO EFECTIVO)", each [Nº DE CAVIDADES]*[#"PRODUÇÃO PREVISTA (nº de cargas/h)"]*[#"TEMPO DE LABORAÇÃO EFECTIVO#(lf)(min)"]/60),
#"Tipo Alterado2" = Table.TransformColumnTypes(#"Personalizado Adicionado1",{{"PRODUÇÃO TOTAL OBJECTIVO (TEMPO EFECTIVO)", Int64.Type}}),
#"Colunas com Nome Mudado" = Table.RenameColumns(#"Tipo Alterado2",{{"PRODUÇÃO TOTAL OBJECTIVO (Nº DE PEÇAS)", "PRODUÇÃO TOTAL OBJECTIVO (TEMPO COM PARAGENS NÃO PROGRAMADAS)"}}),
#"Colunas Reordenadas" = Table.ReorderColumns(#"Colunas com Nome Mudado",{"FINDER", "DATA", "ORDEM FABRICO", "REFERÊNCIA", "LOTE", "OPERADOR", "PRENSA", "TURNO", "PRODUÇÃO TOTAL#(lf)(Nº DE PEÇAS)", "A", "B", "C", "D", "E", "F", "Z", "L", "M", "N", "O", "P", "QUANTIDADE DE PEÇAS OK#(lf)(PRENSA)", "QUANTIDADE DE PEÇAS NOK#(lf)(PRENSA)", "% DEFEITOS#(lf)(PRENSA)", "% DETECÇÃO DE DEFEITOS#(lf)(PRENSA)", "DATA DE INSPECÇÃO", "QUANTIDADE DE PEÇAS VERIFICADA#(lf)(Nº DE PEÇAS)", "TIPO DE INSPECÇÃO", "A ", "B ", "C ", "D ", "E ", "F ", "Z ", "L ", "M ", "N ", "O ", "P ", "PEÇAS RETRABALHADAS ""OK""#(lf)(Nº DE PEÇAS)", "LOTE#(lf)FECHADO", "QUANTIDADE DE PEÇAS OK#(lf)(INSP. FINAL)", "QUANTIDADE DE PEÇAS NOK#(lf)(INSP. FINAL)", "% DEFEITOS#(lf)(INSP. FINAL)", "QUANTIDADE DE PEÇAS OK#(lf)(FINAL)", "QUANTIDADE DE PEÇAS NOK#(lf)(FINAL)", "% DEFEITOS#(lf)(FINAL)", "CONTABILIZAÇÃO DE PEÇAS", "MÊS", "ANO", "MÊS INSP.", "ANO INSP.", "Nº DE CAVIDADES", "PRODUÇÃO PREVISTA (nº de cargas/h)", "AJUSTE DE OBJECTIVO PRODUÇÃO PREVISTA#(lf)(nº de cargas/h)", "A ", "B ", "C ", "D ", "E ", "F ", "G ", "H ", "I ", "Z ", "PRENSA SEM PARAGEM PARA REFEIÇÕES?", "J ", "TEMPO DE PARAGEM NÃO PROGRAMADA (min)", "TEMPO DE PARAGEM PROGRAMADA (min)", "AJUSTE DE TEMPO DE TURNO#(lf)(min)", "LOTE FECHADO", "OBSERVAÇÕES", "PRODUÇÃO EFECTIVA#(lf)(nº de cargas/h)", "PERFORMANCE#(lf)(%)", "DISPONIBILIDADE#(lf)(%)", "QUALIDADE PRENSA#(lf)(%)", "QUALIDADE#(lf)(%)", "OEE OBJECTIVO#(lf)(%)", "WE OBJECTIVO#(lf)(%)", "OEE PRENSA#(lf)(%)", "OEE#(lf)(%)", "Δ OEE#(lf)(Δ%)", "WE PRENSA#(lf)(%)", "WE#(lf)(%)", "Δ WE#(lf)(Δ%)", "TEMPO DE TRABALHO DISPONÍVEL#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS PROGRAMADAS#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS NÃO PROGRAMADAS#(lf)(min)", "TEMPO DE LABORAÇÃO EFECTIVO#(lf)(min)", "EFICÁCIA DE UTILIZAÇÃO#(lf)(%)", "FINDER.1", "COMMENTS", "NOME MÊS", "TRIMESTRE", "AProg", "BProg", "CProg", "DProg", "EProg", "FProg", "GProg", "HProg", "IProg", "Zprog", "ANProg", "BNProg", "CNProg", "DNProg", "ENProg", "FNProg", "GNProg", "HNProg", "INProg", "ZNprog", "PRODUÇÃO TOTAL OBJECTIVO (TEMPO COM PARAGENS NÃO PROGRAMADAS)", "PRODUÇÃO TOTAL OBJECTIVO (TEMPO EFECTIVO)"}),
#"Colunas Removidas2" = Table.RemoveColumns(#"Colunas Reordenadas",{"FINDER.1", "FINDER"}),
#"Personalizado Adicionado2" = Table.AddColumn(#"Colunas Removidas2", "PERFORMANCE LÍQUIDA (%)", each [#"QUANTIDADE DE PEÇAS OK#(lf)(FINAL)"]/[#"PRODUÇÃO TOTAL OBJECTIVO (TEMPO EFECTIVO)"]),
#"Colunas Removidas3" = Table.RemoveColumns(#"Personalizado Adicionado2",{"NOME MÊS"}),
#"Colunas Reordenadas1" = Table.ReorderColumns(#"Colunas Removidas3",{"DATA", "ORDEM FABRICO", "REFERÊNCIA", "LOTE", "OPERADOR", "PRENSA", "TURNO", "PRODUÇÃO TOTAL#(lf)(Nº DE PEÇAS)", "A", "B", "C", "D", "E", "F", "Z", "L", "M", "N", "O", "P", "QUANTIDADE DE PEÇAS OK#(lf)(PRENSA)", "QUANTIDADE DE PEÇAS NOK#(lf)(PRENSA)", "% DEFEITOS#(lf)(PRENSA)", "% DETECÇÃO DE DEFEITOS#(lf)(PRENSA)", "DATA DE INSPECÇÃO", "QUANTIDADE DE PEÇAS VERIFICADA#(lf)(Nº DE PEÇAS)", "TIPO DE INSPECÇÃO", "A ", "B ", "C ", "D ", "E ", "F ", "Z ", "L ", "M ", "N ", "O ", "P ", "PEÇAS RETRABALHADAS ""OK""#(lf)(Nº DE PEÇAS)", "LOTE#(lf)FECHADO", "QUANTIDADE DE PEÇAS OK#(lf)(INSP. FINAL)", "QUANTIDADE DE PEÇAS NOK#(lf)(INSP. FINAL)", "% DEFEITOS#(lf)(INSP. FINAL)", "QUANTIDADE DE PEÇAS OK#(lf)(FINAL)", "QUANTIDADE DE PEÇAS NOK#(lf)(FINAL)", "% DEFEITOS#(lf)(FINAL)", "CONTABILIZAÇÃO DE PEÇAS", "MÊS", "TRIMESTRE", "ANO", "MÊS INSP.", "ANO INSP.", "Nº DE CAVIDADES", "PRODUÇÃO PREVISTA (nº de cargas/h)", "AJUSTE DE OBJECTIVO PRODUÇÃO PREVISTA#(lf)(nº de cargas/h)", "A ", "B ", "C ", "D ", "E ", "F ", "G ", "H ", "I ", "Z ", "PRENSA SEM PARAGEM PARA REFEIÇÕES?", "J ", "TEMPO DE PARAGEM NÃO PROGRAMADA (min)", "TEMPO DE PARAGEM PROGRAMADA (min)", "AJUSTE DE TEMPO DE TURNO#(lf)(min)", "LOTE FECHADO", "OBSERVAÇÕES", "PRODUÇÃO EFECTIVA#(lf)(nº de cargas/h)", "PERFORMANCE#(lf)(%)", "DISPONIBILIDADE#(lf)(%)", "QUALIDADE PRENSA#(lf)(%)", "QUALIDADE#(lf)(%)", "OEE OBJECTIVO#(lf)(%)", "WE OBJECTIVO#(lf)(%)", "OEE PRENSA#(lf)(%)", "OEE#(lf)(%)", "Δ OEE#(lf)(Δ%)", "WE PRENSA#(lf)(%)", "WE#(lf)(%)", "Δ WE#(lf)(Δ%)", "TEMPO DE TRABALHO DISPONÍVEL#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS PROGRAMADAS#(lf)(min)", "TEMPO DE TRABALHO COM PARAGENS NÃO PROGRAMADAS#(lf)(min)", "TEMPO DE LABORAÇÃO EFECTIVO#(lf)(min)", "EFICÁCIA DE UTILIZAÇÃO#(lf)(%)", "COMMENTS", "AProg", "BProg", "CProg", "DProg", "EProg", "FProg", "GProg", "HProg", "IProg", "Zprog", "ANProg", "BNProg", "CNProg", "DNProg", "ENProg", "FNProg", "GNProg", "HNProg", "INProg", "ZNprog", "PRODUÇÃO TOTAL OBJECTIVO (TEMPO COM PARAGENS NÃO PROGRAMADAS)", "PRODUÇÃO TOTAL OBJECTIVO (TEMPO EFECTIVO)", "PERFORMANCE LÍQUIDA (%)"}),
#"Personalizado Adicionado3" = Table.AddColumn(#"Colunas Reordenadas1", "100%", each 1),
#"Personalizado Adicionado4" = Table.AddColumn(#"Personalizado Adicionado3", "90%", each 0.9),
#"Personalizado Adicionado5" = Table.AddColumn(#"Personalizado Adicionado4", "85%", each 0.85),
#"Personalizado Adicionado6" = Table.AddColumn(#"Personalizado Adicionado5", "80%", each 0.80),
#"Personalizado Adicionado7" = Table.AddColumn(#"Personalizado Adicionado6", "70%", each 0.70),
#"Personalizado Adicionado8" = Table.AddColumn(#"Personalizado Adicionado7", "60%", each 0.60),
#"Personalizado Adicionado9" = Table.AddColumn(#"Personalizado Adicionado8", "50%", each 0.50)
in
#"Personalizado Adicionado9"
Thanks to all that can help.
Possibly something is wrong with your key values:
1 Excel table can not have 3 million lines as the maximum is just over 1 million, so logically the source of your issue is at the step where the nested table is expanded: #"Expandido NewColumn".
I ran a small test with 2 tables, each with keys 1-10 and an inner join resulting in a table with 10 rows. So far so good.
Next I emptied the contents of the key columns of each table and ran the query again, resulting in 10 x 10 = 100 rows as each key in either table corresponds with 10 keys in the other table.
So my suggestion would be to verify the values in your FINDER columns.
If this is not the cause, then please share: which is the first step that is causing the issue: you can check each step in the Query Editor.

sass with compass - compile error

I try to use my private sass files together with compass and I get following error:
"sass file.scss:file.css
Syntax error: (“lighten-5”: #ffebee, “lighten-4”: #ffcdd2, “lighten-3”: #ef9a9a, “lighten-2”: #e57373, “lighten-1”: #ef5350, “base”: #f44336, “darken-1”: #e53935, “darken-2”: #d32f2f, “darken-3”: #c62828, “darken-4”: #b71c1c, “accent-1”: #ff8a80, “accent-2”: #ff5252, “accent-3”: #ff1744, “accent-4”: #d50000) isn’t a valid CSS value."
And here is my .scss file which seems to cause the problem.
$m-red: (
"lighten-5": #fdeaeb,
"lighten-4": #f8c1c3,
"lighten-3": #f3989b,
"lighten-2": #ee6e73,
"lighten-1": #ea454b,
"base": #e51c23,
"darken-1": #d0181e,
"darken-2": #b9151b,
"darken-3": #a21318,
"darken-4": #8b1014,
);
$red: (
"lighten-5": #FFEBEE,
"lighten-4": #FFCDD2,
"lighten-3": #EF9A9A,
"lighten-2": #E57373,
"lighten-1": #EF5350,
"base": #F44336,
"darken-1": #E53935,
"darken-2": #D32F2F,
"darken-3": #C62828,
"darken-4": #B71C1C,
"accent-1": #FF8A80,
"accent-2": #FF5252,
"accent-3": #FF1744,
"accent-4": #D50000
);
$pink: (
"lighten-5": #fce4ec,
"lighten-4": #f8bbd0,
"lighten-3": #f48fb1,
"lighten-2": #f06292,
"lighten-1": #ec407a,
"base": #e91e63,
"darken-1": #d81b60,
"darken-2": #c2185b,
"darken-3": #ad1457,
"darken-4": #880e4f,
"accent-1": #ff80ab,
"accent-2": #ff4081,
"accent-3": #f50057,
"accent-4": #c51162
);
$purple: (
"lighten-5": #f3e5f5,
"lighten-4": #e1bee7,
"lighten-3": #ce93d8,
"lighten-2": #ba68c8,
"lighten-1": #ab47bc,
"base": #9c27b0,
"darken-1": #8e24aa,
"darken-2": #7b1fa2,
"darken-3": #6a1b9a,
"darken-4": #4a148c,
"accent-1": #ea80fc,
"accent-2": #e040fb,
"accent-3": #d500f9,
"accent-4": #aa00ff
);
$deep-purple: (
"lighten-5": #ede7f6,
"lighten-4": #d1c4e9,
"lighten-3": #b39ddb,
"lighten-2": #9575cd,
"lighten-1": #7e57c2,
"base": #673ab7,
"darken-1": #5e35b1,
"darken-2": #512da8,
"darken-3": #4527a0,
"darken-4": #311b92,
"accent-1": #b388ff,
"accent-2": #7c4dff,
"accent-3": #651fff,
"accent-4": #6200ea
);
$indigo: (
"lighten-5": #e8eaf6,
"lighten-4": #c5cae9,
"lighten-3": #9fa8da,
"lighten-2": #7986cb,
"lighten-1": #5c6bc0,
"base": #3f51b5,
"darken-1": #3949ab,
"darken-2": #303f9f,
"darken-3": #283593,
"darken-4": #1a237e,
"accent-1": #8c9eff,
"accent-2": #536dfe,
"accent-3": #3d5afe,
"accent-4": #304ffe
);
$blue: (
"lighten-5": #E3F2FD,
"lighten-4": #BBDEFB,
"lighten-3": #90CAF9,
"lighten-2": #64B5F6,
"lighten-1": #42A5F5,
"base": #2196F3,
"darken-1": #1E88E5,
"darken-2": #1976D2,
"darken-3": #1565C0,
"darken-4": #0D47A1,
"accent-1": #82B1FF,
"accent-2": #448AFF,
"accent-3": #2979FF,
"accent-4": #2962FF
);
$light-blue: (
"lighten-5": #e1f5fe,
"lighten-4": #b3e5fc,
"lighten-3": #81d4fa,
"lighten-2": #4fc3f7,
"lighten-1": #29b6f6,
"base": #03a9f4,
"darken-1": #039be5,
"darken-2": #0288d1,
"darken-3": #0277bd,
"darken-4": #01579b,
"accent-1": #80d8ff,
"accent-2": #40c4ff,
"accent-3": #00b0ff,
"accent-4": #0091ea
);
$cyan: (
"lighten-5": #e0f7fa,
"lighten-4": #b2ebf2,
"lighten-3": #80deea,
"lighten-2": #4dd0e1,
"lighten-1": #26c6da,
"base": #00bcd4,
"darken-1": #00acc1,
"darken-2": #0097a7,
"darken-3": #00838f,
"darken-4": #006064,
"accent-1": #84ffff,
"accent-2": #18ffff,
"accent-3": #00e5ff,
"accent-4": #00b8d4
);
$teal: (
"lighten-5": #e0f2f1,
"lighten-4": #b2dfdb,
"lighten-3": #80cbc4,
"lighten-2": #4db6ac,
"lighten-1": #26a69a,
"base": #009688,
"darken-1": #00897b,
"darken-2": #00796b,
"darken-3": #00695c,
"darken-4": #004d40,
"accent-1": #a7ffeb,
"accent-2": #64ffda,
"accent-3": #1de9b6,
"accent-4": #00bfa5
);
$green: (
"lighten-5": #E8F5E9,
"lighten-4": #C8E6C9,
"lighten-3": #A5D6A7,
"lighten-2": #81C784,
"lighten-1": #66BB6A,
"base": #4CAF50,
"darken-1": #43A047,
"darken-2": #388E3C,
"darken-3": #2E7D32,
"darken-4": #1B5E20,
"accent-1": #B9F6CA,
"accent-2": #69F0AE,
"accent-3": #00E676,
"accent-4": #00C853
);
$light-green: (
"lighten-5": #f1f8e9,
"lighten-4": #dcedc8,
"lighten-3": #c5e1a5,
"lighten-2": #aed581,
"lighten-1": #9ccc65,
"base": #8bc34a,
"darken-1": #7cb342,
"darken-2": #689f38,
"darken-3": #558b2f,
"darken-4": #33691e,
"accent-1": #ccff90,
"accent-2": #b2ff59,
"accent-3": #76ff03,
"accent-4": #64dd17
);
$lime: (
"lighten-5": #f9fbe7,
"lighten-4": #f0f4c3,
"lighten-3": #e6ee9c,
"lighten-2": #dce775,
"lighten-1": #d4e157,
"base": #cddc39,
"darken-1": #c0ca33,
"darken-2": #afb42b,
"darken-3": #9e9d24,
"darken-4": #827717,
"accent-1": #f4ff81,
"accent-2": #eeff41,
"accent-3": #c6ff00,
"accent-4": #aeea00
);
$yellow: (
"lighten-5": #fffde7,
"lighten-4": #fff9c4,
"lighten-3": #fff59d,
"lighten-2": #fff176,
"lighten-1": #ffee58,
"base": #ffeb3b,
"darken-1": #fdd835,
"darken-2": #fbc02d,
"darken-3": #f9a825,
"darken-4": #f57f17,
"accent-1": #ffff8d,
"accent-2": #ffff00,
"accent-3": #ffea00,
"accent-4": #ffd600
);
$amber: (
"lighten-5": #fff8e1,
"lighten-4": #ffecb3,
"lighten-3": #ffe082,
"lighten-2": #ffd54f,
"lighten-1": #ffca28,
"base": #ffc107,
"darken-1": #ffb300,
"darken-2": #ffa000,
"darken-3": #ff8f00,
"darken-4": #ff6f00,
"accent-1": #ffe57f,
"accent-2": #ffd740,
"accent-3": #ffc400,
"accent-4": #ffab00
);
$orange: (
"lighten-5": #fff3e0,
"lighten-4": #ffe0b2,
"lighten-3": #ffcc80,
"lighten-2": #ffb74d,
"lighten-1": #ffa726,
"base": #ff9800,
"darken-1": #fb8c00,
"darken-2": #f57c00,
"darken-3": #ef6c00,
"darken-4": #e65100,
"accent-1": #ffd180,
"accent-2": #ffab40,
"accent-3": #ff9100,
"accent-4": #ff6d00
);
$deep-orange: (
"lighten-5": #fbe9e7,
"lighten-4": #ffccbc,
"lighten-3": #ffab91,
"lighten-2": #ff8a65,
"lighten-1": #ff7043,
"base": #ff5722,
"darken-1": #f4511e,
"darken-2": #e64a19,
"darken-3": #d84315,
"darken-4": #bf360c,
"accent-1": #ff9e80,
"accent-2": #ff6e40,
"accent-3": #ff3d00,
"accent-4": #dd2c00
);
$brown: (
"lighten-5": #efebe9,
"lighten-4": #d7ccc8,
"lighten-3": #bcaaa4,
"lighten-2": #a1887f,
"lighten-1": #8d6e63,
"base": #795548,
"darken-1": #6d4c41,
"darken-2": #5d4037,
"darken-3": #4e342e,
"darken-4": #3e2723
);
$blue-grey: (
"lighten-5": #eceff1,
"lighten-4": #cfd8dc,
"lighten-3": #b0bec5,
"lighten-2": #90a4ae,
"lighten-1": #78909c,
"base": #607d8b,
"darken-1": #546e7a,
"darken-2": #455a64,
"darken-3": #37474f,
"darken-4": #263238
);
$grey: (
"lighten-5": #fafafa,
"lighten-4": #f5f5f5,
"lighten-3": #eeeeee,
"lighten-2": #e0e0e0,
"lighten-1": #bdbdbd,
"base": #9e9e9e,
"darken-1": #757575,
"darken-2": #616161,
"darken-3": #424242,
"darken-4": #212121
);
$shades: (
"black": #000000,
"white": #FFFFFF,
"transparent": transparent
);
$colors: (
"m-red": $m-red,
"red": $red,
"pink": $pink,
"purple": $purple,
"deep-purple": $deep-purple,
"indigo": $indigo,
"blue": $blue,
"light-blue": $light-blue,
"cyan": $cyan,
"teal": $teal,
"green": $green,
"light-green": $light-green,
"lime": $lime,
"yellow": $yellow,
"amber": $amber,
"orange": $orange,
"deep-orange": $deep-orange,
"brown": $brown,
"blue-grey": $blue-grey,
"grey": $grey,
"shades": $shades
);
Without compass everything compiles perfect. What's wrong with the file above?
Edit:
Isolated code:
$new_m-red: ( lighten-5: #fdeaeb);
$new_colors: ( "m-red": $m-red);
// Color Classes
#each $color_name,
$color in $new_colors {
#each $color_type,
$color_value in $color{
#if $color_type=="base" {
.#{$color_name} {
background-color: $color_value !important;
}
.#{$color_name}-text {
color: $color_value !important;
}
}
#else {
.#{$color_name}.#{$color_type} {
background-color: $color_value !important;
}
.#{$color_name}-text.text-#{$color_type} {
color: $color_value !important;
}
}
}
}
Compass version:
Compass 1.0.3 (Polaris)
SASS Sass 3.4.19 (Selective Steve)
error:
modified /sass/file/_color.scss
error /sass/file.scss (Line 49 of /sass/file/_color.scss: ("lighten-5": #fdeaeb) isn't a valid CSS value.)
I tried without quotes:
modified /sass/file/_color.scss
error /sass/file.scss (Line 49 of /sass/file/free/_color.scss: (lighten-5: #fdeaeb) isn't a valid CSS value.)

Resources