Select to view content in your preferred language

field map problems

1252
1
Jump to solution
11-27-2012 12:42 PM
MathewCoyle
Honored Contributor
Using Arc 10.0 SP3
I am having some problems using field mapping and python. If I run the code without the field mapping parameter it executes fine, just exporting all the fields in the source table. The problem seems to be the field type is changing. Here is my code.

import os
import arcpy

def getFieldMappings(fc_in, dico):
    field_mappings = arcpy.FieldMappings()

    for input, output in dico.iteritems():
        field_map = arcpy.FieldMap()
        field_map.addInputField(fc_in, input)
        field = field_map.outputField
        field.name = output
        field_map.outputField = field
        field_mappings.addFieldMap(field_map)
        del field, field_map

    return field_mappings

block_id_field = "BLOCKOID"
harv_field_list = [block_id_field, "STARTHARVESTDATE", "SKIDCLEARDATE", "HAULCLEARDATE", "FINALCLEARDATE"]

harv_dico = {
    harv_field_list[0]: "BLOCK_ID",
    harv_field_list[1]: "START_HARV",
    harv_field_list[2]: "SKID",
    harv_field_list[3]: "HAUL",
    harv_field_list[4]: "FINAL"}

table = r"Database Connections/TFM.sde/TFM.V_TFM_HARVEST"
table_out = r"in_memory\temp_table"

if arcpy.Exists(table_out):
    arcpy.Delete_management(table_out)

mapped = getFieldMappings(table, harv_dico)

arcpy.TableToTable_conversion(table, os.path.dirname(table_out), os.path.basename(table_out), "", mapped)


Here is the error I get.
Traceback (most recent call last):
  File "<string>", line 254, in run_nodebug
  File "<module1>", line 39, in <module>
  File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\conversion.py", line 1463, in TableToTable
    raise e
arcgisscripting.ExecuteError: ERROR 000278: Failed on input OID -1, could not write value â??87870â?? to output field BLOCK_ID
Failed to execute (TableToTable).


Here is a dump of the mapped variable that is created.

HAUL "HAULCLEARDATE" true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,HAULCLEARDATE,-1,-1;
START_HARV "STARTHARVESTDATE" true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,STARTHARVESTDATE,-1,-1;
BLOCK_ID "BLOCKOID" true true false 4 Short 0 9 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,BLOCKOID,-1,-1;
FINAL "FINALCLEARDATE" true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,FINALCLEARDATE,-1,-1;
SKID "SKIDCLEARDATE" true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,SKIDCLEARDATE,-1,-1


Using ArcMap, here is a dump of the same tool run successfully with the fields in the output as expected.
BLOCKOID /\BLOCKOID/\ true true false 4 Long 0 9 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,BLOCKOID,-1,-1;
STARTHARVESTDATE /\STARTHARVESTDATE/\ true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,STARTHARVESTDATE,-1,-1;
FINALCLEARDATE /\FINALCLEARDATE/\ true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,FINALCLEARDATE,-1,-1;
HAULCLEARDATE /\HAULCLEARDATE/\ true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,HAULCLEARDATE,-1,-1;
SKIDCLEARDATE /\SKIDCLEARDATE/\ true true false 36 Date 0 0 ,First,#,Database Connections/TFM.sde/TFM.V_TFM_HARVEST,SKIDCLEARDATE,-1,-1


I highlighted what appears to be the problem. For some reason my coded field mapping function changes the field data type for BLOCKOID to short when it should be long, bombing out when it gets to a number above the limit of a short type (â??87870â??).

I'm assuming a sample of a portion of the rows is taken to create the output field type instead of reading the input source field type. Has anyone observed this behaviour or know a work around? I can't seem to find a way to set the output field type which would also solve the issue.
Tags (2)
0 Kudos
1 Solution

Accepted Solutions
MathewCoyle
Honored Contributor
I guess just writing it all out helped frame my problem a little better when the solution was right in front of me. Just switched a few things around.

def getFieldMappings(fc_in, mapping_list):     field_mappings = arcpy.FieldMappings()      for in_field, out_field, out_type in mapping_list:         ...         field.type = out_type      ... harv_list = [     ("OBJECTID", "O_OID", "Double"),     (harv_field_list[0], "BLOCK_ID", "Long"),     (harv_field_list[1], "START_HARV", "Date"),     (harv_field_list[2], "SKID", "Date"),     (harv_field_list[3], "HAUL", "Date"),     (harv_field_list[4], "FINAL", "Date")     ] mapped = getFieldMappings(table, harv_list)

View solution in original post

0 Kudos
1 Reply
MathewCoyle
Honored Contributor
I guess just writing it all out helped frame my problem a little better when the solution was right in front of me. Just switched a few things around.

def getFieldMappings(fc_in, mapping_list):     field_mappings = arcpy.FieldMappings()      for in_field, out_field, out_type in mapping_list:         ...         field.type = out_type      ... harv_list = [     ("OBJECTID", "O_OID", "Double"),     (harv_field_list[0], "BLOCK_ID", "Long"),     (harv_field_list[1], "START_HARV", "Date"),     (harv_field_list[2], "SKID", "Date"),     (harv_field_list[3], "HAUL", "Date"),     (harv_field_list[4], "FINAL", "Date")     ] mapped = getFieldMappings(table, harv_list)
0 Kudos