I have a map variable that I am trying to pass into a batch class. This variable was created and populated in another batch class (which is why I can't just create it in the `Start()` method of the second batch class). 

The first batch class implments `Database.Stateful`, in order to preserve the values I store in the map variable. Then, in the `Finish()`  method, I call the second batch class, passing the map variable, like so:

`Database.executeBatch(new BatchClass(mapVariable));`

The problem I'm running into is that I can't get the second batch class to recognize that I've passed this map to it. I've tried using the `this.variable` assignment in the constructor class without being clear on its purpose, to no avail. Here's an idea of what that second batch class looks like now:


----------


    global class BatchClass implements Database.Batchable<sObject>{
    	
     
    	String query = '[some SOQL query]';
    
    	
    	global BatchClass(map<key, value> mapVariable) {
    		this.mapVariable = mapVariable;
    	}
    	
    	global Database.QueryLocator start(Database.BatchableContext BC) {
    		return Database.getQueryLocator(query);
    	}
    
       	global void execute(Database.BatchableContext BC, List<sObject> scope) {
    	      methodWhichUsesMapVariable();
    	}
    	
    	global void finish(Database.BatchableContext BC) {}


----------


In this format, the batch class doesn't recognize `mapVariable` (says it does not exist). I've also tried making this batch class stateful, as well as declaring the mapVariable separately prior to the start() method, similar to the `query` variable, which I thought might be necessary to do the `this.mapVariable` assignment. 

How can I make it so this Batch class can use the map variable I'm trying to pass to it? Thanks for your help and Merry Xmas/happy holidays!


----------
**EDIT:**

So I got it to work (or at least save without error) by declaring the map variable before the `start()` method, then assigning the passed variable to it, like so:

        public static map<string, decimal> mapVariable = new map<string, decimal>();
       
    	global BatchClass(Map<string, decimal> sameMapVariableWithDiffName) {
    		mapVariable = sameMapVariableWithDiffName;    		
    	}

The interesting thing is, it didn't work until I specifically made the declared variable a `static` variable. My understanding is that even though I made this batch class `stateful`, static variables are reset with every batch. I don't know if this means I'm going to lose the map values after the first batch, but I'm about to find out!

If anyone knows why I could only get this to work by declaring the map static, I'd love to learn the reason!


----------


**EDIT 2:**

First off, my 'solution' from EDIT 1 doesn't seem to be working (I think the map I'm using in my second batch class is actually an empty map, not what I tried to pass from the first batch class).

Anyway, in response to a request from Crop1645, here is the first part of the code for my batch class without any simplification or abstraction (which I had done in my first code example):

    global class ClientMetrics_Stage6 implements Database.Batchable<sObject>, Database.Stateful {
    	
    	
    	//Stage 6
    	//Batches through the Usage Aggregate Data that was inserted in Stage 2. 
    	//For each batch, pulls all* accounts' contracts and addendums in the system, determines matchings between them and the Aggregate usage data, 
    	//and applies calculations using the contract data.
    	//*: Not ALL accounts, actually, just those who have been marked ready for contract review, and didn't have any results in their audit field.
    
    	//This stage takes a map passed in from stage 5, which has stored the total number of courses launched for each Account/month/product combo. This will be used by
    	//calcRecMMAC() to calculate the individual record MMAC (which is derived from the ratio of courses launched in that record vs courses launched for that account/month/product)
     
    	String query = 'SELECT ID, Account__c, Aggregate_Courses_Launched__c, Aggregate_Set__c, Country__c, Domain__c, MonthStart__c, YearStart__c, Product__c, Course_Name__c, Launch_Month__c ' + 
    					'FROM Usage_Data_Aggregates__c WHERE Aggregate_Set__c = \'General Aggregated Usage\' AND Account__r.Contracts_Reviewed__c = TRUE AND Account__r.Audit_Field_Overlapping_Contracts__c =\'\'';
    
    	static map<string,string> productMap = new map<string,string>{'IPIMS BL Subtopic' => 'IPIMS Background Learning',
    	                       'IPIMS BL Topic' => 'IPIMS Background Learning',
    	                       'IPIMS AL' => 'IPIMS Action Learning',
    	                       'PO' => 'Petroleum Online',
    	                       'BEES' => 'Business Essentials',
    	                       'O&M' => 'Operations, Mntnc & Control Systems',
    	                       'HSE' => 'Health, Safety & Environment',
    	                       'N/A' => 'N/A'};
    
       public static map<string, decimal> totalLaunchCountMap = new map<string, decimal>();
       
    
    	global ClientMetrics_Stage6(Map<string, decimal> tlcMap) {
    
    		totalLaunchCountMap = tlcMap;
    		
    	}
    	
    	global Database.QueryLocator start(Database.BatchableContext BC) {
    		return Database.getQueryLocator(query);
    	}
    
       	global void execute(Database.BatchableContext BC, List<sObject> scope) {

    .... (I'll stop it here since there's a lot of methods called in the execute portion).


----------

Crop, you're right that I'm getting the error at compile time (ie, when I attempt to save my code) except when using the code I show here, which uses a static declaration of the map and doesn't seem to work anyway. The error simply states that "variable: totalLaunchCountMap doesn't exist".