rem: if ( !strcmp ( pointeur_char,
add: if ( !strcmp ( g_strstrip ( pointeur_char ),
context: void fin_edition ( void ){  struct structure_operation *operation;  struct structure_operation *operation_2;  gchar *pointeur_char;  GSList *pointeur_liste;  gchar **tableau_char;  gint virement;  gint compte_virement = 0;  struct struct_devise *devise;  struct struct_devise *devise_compte;  p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;  /* vrifie que la date est correcte */  if ( !modifie_date ( widget_formulaire_operations[1] ))    {      dialogue ( " Erreur : La date est invalide" );      gtk_widget_grab_focus ( widget_formulaire_operations[1] );      gtk_entry_select_region ( GTK_ENTRY (  widget_formulaire_operations[1]),				0,				-1);      return;    }  /* vrification que ce n'est pas un virement sur lui-mme */  if ( !g_strcasecmp ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX (widget_formulaire_operations[8]))),		       g_strconcat ( "Virement : ", NOM_DU_COMPTE, NULL ) ) )    {      dialogue ( " Erreur : impossibilit de virer un compte   \n    sur lui-mme");      return;    }  /*   rcupration de l'opration : soit l'adr de la struct, soit NULL si nouvelle */  operation = gtk_object_get_data ( GTK_OBJECT ( formulaire ),				    "adr_struct_ope" );  /*   pour les types qui sont  incrmentation automatique ( surtout les chques ) */  /* on fait le tour des operations pour voir si le no n'a pas dj t utilis */  /* si operation n'est pas nul, c'est une modif donc on ne fait pas ce test */  if ( GTK_WIDGET_VISIBLE ( widget_formulaire_operations[10] ))    {      struct struct_type_ope *type;      type = gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[9] ) -> menu_item ),				   "adr_type" );      if ( type -> numerotation_auto )	{	  /* vrifie s'il y a quelque chose */	  if ( gtk_widget_get_style ( widget_formulaire_operations[10] ) == style_entree_formulaire[1] )	    {	      if ( question ( "Le type d'opration choisi est  numrotation automatique mais ne contient aucun numro.\nSouhaitez-vous continuer ?" ) )		goto sort_test_cheques;	      else		return;	    }	  if ( !operation )	    {	      GSList *liste_tmp;	      gchar *no_cheque;	      liste_tmp = LISTE_OPERATIONS;	      no_cheque = g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[10] )));	      while ( liste_tmp )		{		  struct structure_operation *operation_tmp;		  operation_tmp = liste_tmp -> data;		  if ( operation_tmp -> type_ope == type -> no_type		       &&		       !strcmp ( operation_tmp -> contenu_type,				 no_cheque ))		    {		      if ( question ( "Attention, le numro du chque est dj utilis.\nSouhaitez-vous continuer ?" ))			goto sort_test_cheques;		      else			return;		    }		  liste_tmp = liste_tmp -> next;		}	    }	}    }  sort_test_cheques :    /*   vrifie tout de suite si c'est une opration ventile, */    /*si c'est le cas, si la liste des ventilation existe, on va l'enregistrer plus tard */    /* sinon on va ventiler tout de suite */    if ( !strcmp ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_operations[8] ))),		   "Opration ventile" )	 &&	 !gtk_object_get_data ( GTK_OBJECT ( formulaire ),				"liste_adr_ventilation" ))      {	enregistre_ope_au_retour = 1;	if ( gtk_widget_get_style ( widget_formulaire_operations[3] ) == style_entree_formulaire[0] )	  ventiler_operation ( g_strtod ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[3] ))),					  NULL ),			       0 );	else	  ventiler_operation ( g_strtod ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[4] ))),					  NULL ),			       1 );	return;      }  /* si c'est une nouvelle op, on la cre, met son numro  0, le compte courant, et manuelle */  if ( !operation )    {      operation = calloc ( 1,			   sizeof ( struct structure_operation ) );      operation -> no_compte = compte_courant;    }  /* traitement de la date */  pointeur_char = g_strstrip ( gtk_entry_get_text ( GTK_ENTRY (widget_formulaire_operations[1])));  tableau_char = g_strsplit ( pointeur_char,			      "/",			      3 );  operation -> jour = strtod ( tableau_char[0],			       NULL );  operation -> mois = strtod ( tableau_char[1],			       NULL );  operation -> annee = strtod (tableau_char[2],			       NULL );  operation->date = g_date_new_dmy ( operation->jour,				     operation->mois,				     operation->annee);  strcpy ( date_courante,	   pointeur_char );  /* rcupration du tiers, s'il n'existe pas, on le cre */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_operations[2] ) -> entry ) == style_entree_formulaire[0] )    {      pointeur_char = g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_operations[2] )));      if ( ( pointeur_liste = g_slist_find_custom ( liste_struct_tiers,						    pointeur_char,						    ( GCompareFunc ) recherche_tiers_par_nom )) )	operation -> tiers = (( struct struct_tiers * )( pointeur_liste -> data )) -> no_tiers;      else	operation -> tiers = (( struct struct_tiers * )( ajoute_nouveau_tiers ( pointeur_char ))) -> no_tiers;    }  else    operation -> tiers = 0;  /* rcupration du montant */  if ( gtk_widget_get_style ( widget_formulaire_operations[3] ) == style_entree_formulaire[0] )    operation -> montant = -g_strtod ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[3] ))),				       NULL );  else    operation -> montant = g_strtod ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[4] ))),				      NULL );  /* rcupration de la devise */   devise = gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[5] ) -> menu_item ),				 "adr_devise" );  /* si c'est la devise du compte ou */  /* si c'est un compte qui doit passer  l'euro ( la transfo se fait au niveau de l'affichage de la liste ) */  /* ou si c'est un compte en euro et l'op est dans une devise qui doit passer  l'euro -> pas de change  demander */  p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;  devise_compte = g_slist_find_custom ( liste_struct_devises,					GINT_TO_POINTER ( DEVISE ),					( GCompareFunc ) recherche_devise_par_no ) -> data;  operation -> devise = devise -> no_devise;  if ( !( operation -> no_operation	  ||	  devise -> no_devise == DEVISE	  ||	  ( devise_compte -> passage_euro && !strcmp ( devise -> nom_devise, "Euro" ))	  ||	  ( !strcmp ( devise_compte -> nom_devise, "Euro" ) && devise -> passage_euro )))    {      /* c'est une devise trangre, on demande le taux de change et les frais de change */      demande_taux_de_change ( devise_compte,			       devise,			       1,			       (gdouble ) 0,			       (gdouble ) 0 );      operation -> taux_change = taux_de_change[0];      operation -> frais_change = taux_de_change[1];      if ( operation -> taux_change < 0 )	{	  operation -> taux_change = -operation -> taux_change;	  operation -> une_devise_compte_egale_x_devise_ope = 1;	}    }  /* rcupration du type d'opration */  if ( GTK_WIDGET_VISIBLE ( widget_formulaire_operations[9] ))    {      operation -> type_ope = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[9] ) -> menu_item ),								      "no_type" ));      if ( GTK_WIDGET_VISIBLE ( widget_formulaire_operations[10] )	   &&	   gtk_widget_get_style ( widget_formulaire_operations[10] ) == style_entree_formulaire[0] )	{	  struct struct_type_ope *type;	  type = gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[9] ) -> menu_item ),				       "adr_type" );	  operation -> contenu_type = g_strdup ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[10] ))));	  if ( type -> numerotation_auto )	    type -> no_en_cours = ( atoi ( operation -> contenu_type ));	}      else	operation -> contenu_type = NULL;    }  else    {      operation -> type_ope = 0;      operation -> contenu_type = NULL;    }  /* rcupration du no d'exercice */  operation -> no_exercice = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[11] ) -> menu_item ),								     "no_exercice" ));  /* rcupration de l'imputation budgtaire */  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_operations[12] ) -> entry ) == style_entree_formulaire[0] )    {      struct struct_imputation *imputation;            pointeur_char = gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_operations[12] ));      tableau_char = g_strsplit ( pointeur_char,				  ":",				  2 );            tableau_char[0] = g_strstrip ( tableau_char[0] );      if ( tableau_char[1] )	tableau_char[1] = g_strstrip ( tableau_char[1] );      pointeur_liste = g_slist_find_custom ( liste_struct_imputation,					     tableau_char[0],					     ( GCompareFunc ) recherche_imputation_par_nom );      if ( pointeur_liste )	imputation = pointeur_liste -> data;      else	{	  imputation = ajoute_nouvelle_imputation ( tableau_char[0] );	  if ( operation -> montant < 0 )	    imputation -> type_imputation = 1;	  else	    imputation -> type_imputation = 0;	}      operation -> imputation = imputation -> no_imputation;	        if ( tableau_char[1] && strlen (tableau_char[1]) )	{	  struct struct_sous_imputation *sous_imputation;		  	  pointeur_liste = g_slist_find_custom ( imputation -> liste_sous_imputation,						 tableau_char[1],						 ( GCompareFunc ) recherche_sous_imputation_par_nom );	      	  if ( pointeur_liste )	    sous_imputation = pointeur_liste -> data;	  else	    sous_imputation = ajoute_nouvelle_sous_imputation ( tableau_char[1],								imputation );		  	  operation -> sous_imputation = sous_imputation -> no_sous_imputation;	}      else	operation -> sous_imputation = 0;      g_strfreev ( tableau_char );    }  else    {      operation -> imputation = 0;      operation -> sous_imputation = 0;    }/* rcupration du no de pice comptable */  if ( gtk_widget_get_style ( widget_formulaire_operations[13] ) == style_entree_formulaire[0] )    operation -> no_piece_comptable = g_strdup ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[13] ))));  else    operation -> no_piece_comptable = NULL;  /* rcupration des notes */  if ( gtk_widget_get_style ( widget_formulaire_operations[15] ) == style_entree_formulaire[0] )    operation -> notes = g_strdup ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[15] ))));  else    operation -> notes = NULL;  /* rcupration de l'info banque/guichet */  if ( gtk_widget_get_style ( widget_formulaire_operations[16] ) == style_entree_formulaire[0] )    operation -> info_banque_guichet = g_strdup ( g_strstrip ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_operations[16] ))));  else    operation -> info_banque_guichet = NULL;  /*   rcupration des catgories / sous-catg, s'ils n'existent pas, on les cre */  /*  mettre en dernier car si c'est une op ventile, chaque op de ventil va rcuprer les donnes du dessus */  virement = 0;  if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_operations[8] ) -> entry ) == style_entree_formulaire[0] )    {      struct struct_categ *categ;            pointeur_char = gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_operations[8] ));      /* rcupration de la ventilation si ncessaire */      if ( !strcmp ( pointeur_char,		     "Opration ventile" ))	{	  /* c'est une opration ventile : bcp de choses  faire : */	  /* -faire le tour de chaque op de ventilation et remplir les champs qu'on n'avait pu remplir avant (date,tiers,devise... ) */	  /* -si une des op de ventilation est un virement, il faut modifier aussi l'opration vire sur l'autre compte */	  GSList *pointeur_tmp;	  operation -> operation_ventilee = 1;	  operation -> categorie = 0;	  operation -> sous_categorie = 0;	  /* fait le tour des ops de ventilation pour modifier ce qui reste */	  pointeur_tmp = gtk_object_get_data ( GTK_OBJECT ( formulaire ),					       "liste_adr_ventilation" );	  if ( pointeur_tmp != GINT_TO_POINTER ( -1 ))	    {	      while ( pointeur_tmp )		{		  struct structure_operation *ope_de_ventilation;		  ope_de_ventilation = pointeur_tmp -> data;		  /* on commence par mettre le no de l'opration en rapport qui lui sera attribue */		  if ( operation -> no_operation )		    ope_de_ventilation -> no_operation_ventilee_associee = operation -> no_operation;		  else		    ope_de_ventilation -> no_operation_ventilee_associee = no_derniere_operation + 1;		  ope_de_ventilation -> jour = operation -> jour;		  ope_de_ventilation -> mois = operation -> mois;		  ope_de_ventilation -> annee = operation -> annee;		  ope_de_ventilation -> date = g_date_new_dmy ( ope_de_ventilation -> jour,								ope_de_ventilation -> mois,								ope_de_ventilation -> annee );		  ope_de_ventilation -> devise = operation -> devise;		  ope_de_ventilation -> une_devise_compte_egale_x_devise_ope = operation -> une_devise_compte_egale_x_devise_ope;		  ope_de_ventilation -> taux_change = operation -> taux_change;		  ope_de_ventilation -> frais_change = operation -> frais_change;		  ope_de_ventilation -> tiers = operation -> tiers;		  ope_de_ventilation -> type_ope = operation -> type_ope;		  ope_de_ventilation -> no_exercice = operation -> no_exercice;		  ope_de_ventilation -> imputation = operation -> imputation;		  ope_de_ventilation -> sous_imputation = operation -> sous_imputation;		  ope_de_ventilation -> pointe = operation -> pointe;		  ope_de_ventilation -> auto_man = operation -> auto_man;		  /*   maintenant, si c'est un virement, on doit mettre  jour l'op en relation */		  if ( ope_de_ventilation -> relation_no_operation )		    {		      struct structure_operation *ope_virement;		      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + ope_de_ventilation -> relation_no_compte;		      ope_virement = g_slist_find_custom ( LISTE_OPERATIONS,							   GINT_TO_POINTER ( ope_de_ventilation -> relation_no_operation),							   (GCompareFunc) recherche_operation_par_no ) -> data;		      ope_virement -> jour = ope_de_ventilation -> jour;		      ope_virement -> mois = ope_de_ventilation -> mois;		      ope_virement -> annee = ope_de_ventilation -> annee;		      ope_virement -> date = g_date_new_dmy ( ope_virement -> jour,							      ope_virement -> mois,							      ope_virement -> annee );		      ope_virement -> devise = ope_de_ventilation -> devise;		      ope_virement -> une_devise_compte_egale_x_devise_ope = operation -> une_devise_compte_egale_x_devise_ope;		      ope_virement -> taux_change = operation -> taux_change;		      ope_virement -> frais_change = operation -> frais_change;		      ope_virement -> tiers = ope_de_ventilation -> tiers;		      ope_virement -> auto_man = ope_de_ventilation -> auto_man;		      ope_virement -> type_ope = ope_de_ventilation -> type_ope;		      ope_virement -> no_exercice = ope_de_ventilation -> no_exercice;		      ope_virement -> imputation = ope_de_ventilation -> imputation;		      ope_virement -> sous_imputation = ope_de_ventilation -> sous_imputation;		      MISE_A_JOUR = 1;		      mise_a_jour_solde ( ope_virement -> no_compte );		      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;		    }		  pointeur_tmp = pointeur_tmp -> next;		}	    }	}      else	{	  tableau_char = g_strsplit ( pointeur_char,				      ":",				      2 );      	  tableau_char[0] = g_strstrip ( tableau_char[0] );	  if ( tableau_char[1] )	    tableau_char[1] = g_strstrip ( tableau_char[1] );	  if ( strlen ( tableau_char[0] ) )	    {	      if ( !strcmp ( tableau_char[0],			     "Virement" )		   && tableau_char[1]		   && strlen ( tableau_char[1]) )		{		  /* c'est un virement, il n'y a donc aucune cattorie */		  gint i;		  operation -> categorie = 0;		  operation -> sous_categorie = 0;		  /* spare entre virement vers un compte et virement vers un compte supprim */		  if ( strcmp ( tableau_char[1],				"Compte supprim" ) )		    {		      virement = 1;		      /* recherche le no de compte du virement */		      p_tab_nom_de_compte_variable = p_tab_nom_de_compte;		      compte_virement = -1;		      for ( i = 0 ; i < nb_comptes ; i++ )			{			  if ( !g_strcasecmp ( NOM_DU_COMPTE,					       tableau_char[1] ) )			    compte_virement = i;			  p_tab_nom_de_compte_variable++;			}		      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;		      if ( compte_virement == -1 )			{			  dialogue ( "Erreur : le compte associ au virement est invalide" );			  if ( !operation -> no_operation )			    free ( operation );			  return;			}		    }		  else		    {		      /* c'est un virement vers un compte supprim */		      operation -> relation_no_compte = -1;		      operation -> relation_no_operation = 1;		    }		}	      else		{		  /* c'est une catg normale, si c'est une modif d'op, vrifier si ce n'tait pas une ventilation */		  if ( operation -> no_operation		       &&		       operation -> operation_ventilee )		    {		      /* c'tait une op ventile et cela ne l'est plus, il faut virer toutes les */		      /* 	ops de ventilations associes  cette op */		      GSList *liste_tmp;		      liste_tmp = LISTE_OPERATIONS;		      while ( liste_tmp )			{			  struct structure_operation *ope_tmp;		      			  ope_tmp = liste_tmp -> data;			  if ( ope_tmp -> no_operation_ventilee_associee == operation -> no_operation )			    {			      liste_tmp = liste_tmp -> next;			      supprime_operation ( ope_tmp );			    }			  else			    liste_tmp = liste_tmp -> next;			}		      operation -> operation_ventilee = 0;		    }		  pointeur_liste = g_slist_find_custom ( liste_struct_categories,							 tableau_char[0],							 ( GCompareFunc ) recherche_categorie_par_nom );		  if ( pointeur_liste )		    categ = pointeur_liste -> data;		  else		    {		      categ = ajoute_nouvelle_categorie ( tableau_char[0] );		      if ( operation -> montant < 0 )			categ -> type_categ = 1;		      else			categ -> type_categ = 0;		    }		  operation -> categorie = categ -> no_categ;	  		  if ( tableau_char[1] && strlen (tableau_char[1]) )		    {		      struct struct_sous_categ *sous_categ;		  		      pointeur_liste = g_slist_find_custom ( categ -> liste_sous_categ,							     tableau_char[1],							     ( GCompareFunc ) recherche_sous_categorie_par_nom );	      		      if ( pointeur_liste )			sous_categ = pointeur_liste -> data;		      else			sous_categ = ajoute_nouvelle_sous_categorie ( tableau_char[1],								      categ );		  		      operation -> sous_categorie = sous_categ -> no_sous_categ;		    }		  else		    operation -> sous_categorie = 0;		}	    }	  else	    {	      operation -> categorie = 0;	      operation -> sous_categorie = 0;	    }	  g_strfreev ( tableau_char );	}    }  else    {      operation -> categorie = 0;      operation -> sous_categorie = 0;    }   /*   on a fini de remplir l'op, on peut l'ajouter  la liste */  ajout_operation ( operation );  /* si on est en train d'quilibrer => recalcule le total point */  if ( etat.equilibrage )    {      GSList *pointeur_liste_ope;      struct struct_devise *devise_compte;      struct struct_devise *devise_operation;      p_tab_nom_de_compte_variable =  p_tab_nom_de_compte_courant;      /* rcupre l'adr de la devise du compte */      devise_compte = g_slist_find_custom ( liste_struct_devises,					    GINT_TO_POINTER ( DEVISE ),					    ( GCompareFunc ) recherche_devise_par_no) -> data;      pointeur_liste_ope = LISTE_OPERATIONS;      operations_pointees = 0;      while ( pointeur_liste_ope )	{	  struct structure_operation *operation;	  operation = pointeur_liste_ope -> data;	  if ( operation -> pointe == 1 )	    {	      gdouble montant;	      if ( operation -> devise == DEVISE )		montant = operation -> montant;	      else		{		  /* ce n'est pas la devise du compte, si le compte passe  l'euro et que la devise est l'euro, utilise la conversion du compte, */		  /* si c'est une devise qui passe  l'euro et que la devise du compte est l'euro, utilise la conversion du compte */		  /* sinon utilise la conversion stocke dans l'op */	      		  devise_operation = g_slist_find_custom ( liste_struct_devises,							   GINT_TO_POINTER ( operation -> devise ),							   ( GCompareFunc ) recherche_devise_par_no ) -> data;	      		  if ( devise_compte -> passage_euro		       &&		       !strcmp ( devise_operation -> nom_devise, "Euro" ) )		    montant = operation -> montant * devise_compte -> change - operation -> frais_change;		  else		    if ( devise_operation -> passage_euro			 &&			 !strcmp ( devise_compte -> nom_devise, "Euro" ))		      montant = operation -> montant / devise_operation -> change;		    else		      if ( operation -> une_devise_compte_egale_x_devise_ope )			montant = operation -> montant / operation -> taux_change - operation -> frais_change;		      else			montant = operation -> montant * operation -> taux_change - operation -> frais_change;		  montant = ( rint (montant * 100 )) / 100;		}	      operations_pointees = operations_pointees + montant;	    }	  pointeur_liste_ope = pointeur_liste_ope -> next;	}      gtk_label_set_text ( GTK_LABEL ( label_equilibrage_pointe ),			   g_strdup_printf ( "%4.2f", 					     operations_pointees ));      if ( fabs ( solde_final - solde_initial - operations_pointees ) < 0.01 )	{	  gtk_label_set_text ( GTK_LABEL ( label_equilibrage_ecart ),			       g_strdup_printf ( "%4.2f",						 0.0 ));	  gtk_widget_set_sensitive ( GTK_WIDGET ( bouton_ok_equilibrage ),				     TRUE );	}      else	{	  gtk_label_set_text ( GTK_LABEL ( label_equilibrage_ecart ),			       g_strdup_printf ( "%4.2f",						 solde_final - solde_initial - operations_pointees ));	  gtk_widget_set_sensitive ( GTK_WIDGET ( bouton_ok_equilibrage ),				     FALSE );	}    }  /*   si c'tait un virement, on cre une copie de l'op, on l'ajout  la liste puis on remplit les relations */  if ( !virement )    {      if ( operation -> relation_no_operation )	{	  /* c'tait un virement, et ce ne l'est plus, donc on efface l'op en relation */	  p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;	  operation_2 = g_slist_find_custom ( LISTE_OPERATIONS,					      GINT_TO_POINTER ( operation -> relation_no_operation ),					      ( GCompareFunc ) recherche_operation_par_no ) -> data;	  	  operation_2 -> relation_no_operation = 0;	  supprime_operation ( operation_2 );	  p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;	  operation -> relation_no_operation = 0;	  operation -> relation_no_compte = 0;	  MISE_A_JOUR = 1;	}    }  else    {          /* si c'tait une nvelle op, les relations sont nulles, sinon rcupre l'op correspondante */      struct struct_devise *devise_compte_2;      /* 	si en modifiant le virement on a modifi le compte associ, on supprime l'opration associe */      /* et en recre une nouvelle */      if ( operation -> relation_no_operation )	{	  /* c'est une modif de virement, recherche l'op associe */	  p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;	  operation_2 = g_slist_find_custom ( LISTE_OPERATIONS,					      GINT_TO_POINTER ( operation -> relation_no_operation ),					      ( GCompareFunc ) recherche_operation_par_no ) -> data;	  /* 	si en modifiant le virement on a modifi le compte associ, on supprime l'opration associe */	  /* et en recre une nouvelle */	  if ( operation -> relation_no_compte != compte_virement )	    {	      operation_2 -> relation_no_operation = 0;	      supprime_operation ( operation_2 );	      operation_2 = calloc ( 1,				     sizeof ( struct structure_operation ) );	      operation_2 -> no_compte = compte_virement;	      /* il faudra rafficher la liste en cours */	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;	      MISE_A_JOUR = 1;	    }	}      else	{	  operation_2 = calloc ( 1,				 sizeof ( struct structure_operation ) );	  operation_2 -> no_compte = compte_virement;	}            p_tab_nom_de_compte_variable = p_tab_nom_de_compte + compte_virement;      /* remplit la nouvelle op */            operation_2 -> jour = operation -> jour;      operation_2 -> mois = operation -> mois;      operation_2 -> annee = operation -> annee;      operation_2 ->date = g_date_new_dmy ( operation_2->jour,					    operation_2->mois,					    operation_2->annee);      operation_2 -> montant = -operation -> montant;      /* si c'est la devise du compte ou si c'est un compte qui doit passer  l'euro ( la transfo se fait au niveau */      /* de l'affichage de la liste ) ou si c'est un compte en euro et l'op est dans une devise qui doit passer  l'euro -> ok */      devise_compte_2 = g_slist_find_custom ( liste_struct_devises,					      GINT_TO_POINTER ( DEVISE ),					      ( GCompareFunc ) recherche_devise_par_no ) -> data;      operation_2 -> devise = operation -> devise;      if ( !( operation_2-> no_operation	      ||	      devise -> no_devise == DEVISE	      ||	      ( devise_compte_2 -> passage_euro && !strcmp ( devise -> nom_devise, "Euro" ))	      ||	      ( !strcmp ( devise_compte_2 -> nom_devise, "Euro" ) && devise -> passage_euro )))	{	  /* c'est une devise trangre, on demande le taux de change et les frais de change */	  	  demande_taux_de_change ( devise_compte_2,				   devise,				   1,				   (gdouble ) 0,				   (gdouble ) 0 );	  operation_2 -> taux_change = taux_de_change[0];	  operation_2 -> frais_change = taux_de_change[1];	  if ( operation_2 -> taux_change < 0 )	    {	      operation_2 -> taux_change = -operation_2 -> taux_change;	      operation_2 -> une_devise_compte_egale_x_devise_ope = 1;	    }	}      else	{	  operation_2 -> taux_change = 0;	  operation_2 -> frais_change = 0;	}      operation_2 -> tiers = operation -> tiers;      operation_2 -> categorie = operation -> categorie;      operation_2 -> sous_categorie = operation -> sous_categorie;      if ( operation -> notes )	operation_2 -> notes = g_strdup ( operation -> notes);      operation_2 -> auto_man = operation -> auto_man;      operation_2 -> type_ope = operation -> type_ope;      if ( operation -> contenu_type )	operation_2 -> contenu_type = g_strdup ( operation -> contenu_type );      operation_2 -> no_exercice = operation -> no_exercice;      operation_2 -> imputation = operation -> imputation;      operation_2 -> sous_imputation = operation -> sous_imputation;      if ( operation -> no_piece_comptable )      operation_2 -> no_piece_comptable = g_strdup ( operation -> no_piece_comptable );      if ( operation -> info_banque_guichet )      operation_2 -> info_banque_guichet = g_strdup ( operation -> info_banque_guichet );      /*   on a fini de remplir l'op, on peut l'ajouter  la liste */      ajout_operation ( operation_2 );      /* on met maintenant les relations entre les diffrentes op */      operation -> relation_no_operation = operation_2 -> no_operation;      operation -> relation_no_compte = operation_2 -> no_compte;      operation_2 -> relation_no_operation = operation -> no_operation;      operation_2 -> relation_no_compte = operation -> no_compte;      verification_mise_a_jour_liste ();      /* on met  jour le compte courant pour le virement ( il a t mis  jour avec ajout opration, mais sans les liens de virement ) */      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> no_compte;      MISE_A_JOUR = 1;      verification_mise_a_jour_liste ();    }  /* si c'tait une nouvelle opration, on efface le formulaire, on remet la date pour la suivante, */  /* si c'tait une modification, on redonne le focus  la liste */  p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> no_compte;  etat.formulaire_en_cours = 0;  if ( gtk_object_get_data ( GTK_OBJECT ( formulaire ),			     "adr_struct_ope" ) )    {      gtk_widget_grab_focus ( GTK_WIDGET ( CLIST_OPERATIONS ));      formulaire_a_zero ();      if ( !etat.formulaire_toujours_affiche )	gtk_widget_hide ( frame_droite_bas );    }  else    {      formulaire_a_zero ();      clique_champ_formulaire ( widget_formulaire_operations[1],				NULL,				GINT_TO_POINTER ( 1 ));      gtk_entry_select_region ( GTK_ENTRY (  widget_formulaire_operations[1]),				0,				-1);      gtk_widget_grab_focus ( GTK_WIDGET ( widget_formulaire_operations[1] ));      etat.formulaire_en_cours = 1;    }  /*   met  jour les listes ( nouvelle opration associe au tiers et  la catgorie ) */  mise_a_jour_tiers ();  mise_a_jour_categ ();  mise_a_jour_imputation ();  modification_fichier ( TRUE );}