Revision 44926 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/java/org/gvsig/fmap/dal/store/dbf/utils/DbaseFileHeader.java

View differences:

DbaseFileHeader.java
649 649
          attr.setAllowNull(true);
650 650
          break;
651 651
        case DBFTYPE_FLOAT:
652
          if (dbfattr.getScale() > 0) {
652
          if (dbfattr.getScale()==-1 || dbfattr.getScale() > 0) {
653 653
            if (dbfattr.getSize() > DataType.DOUBLE_MAX_PRECISION+3) {
654 654
              attr = featureType.add(dbfattr.getName(),
655 655
                      DataTypes.DECIMAL, dbfattr.getSize());
......
712 712
          }
713 713
          break;
714 714
        case DBFTYPE_NUMBER:
715
          if (dbfattr.getScale() > 0) {
715
          if (dbfattr.getScale()==-1 || dbfattr.getScale() > 0) {
716 716
            attr = featureType.add(dbfattr.getName(),
717 717
                    DataTypes.DECIMAL, dbfattr.getSize());
718 718
            attr.setPrecision(dbfattr.getPrecision());
......
834 834
      int requiredBytes = descriptor.getRequiredBytes();
835 835
      switch (type) {
836 836
        case DataTypes.DECIMAL:
837
          header.addColumn(colName, DBFTYPE_NUMBER, requiredBytes>0?requiredBytes:precision+3, precision, scale);
837
          if( requiredBytes<1 ) {
838
            if( precision < 0) {
839
              requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
840
            } else {
841
              requiredBytes = precision + 3;
842
            }
843
          }
844
          if( requiredBytes>DbaseFieldDescriptor.MAX_NUMBER_SIZE ) {
845
            requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
846
          }
847
          header.addColumn(colName, DBFTYPE_NUMBER, requiredBytes, precision, scale);
838 848
          break;
839 849
        case DataTypes.DOUBLE:
840
          header.addColumn(colName, DBFTYPE_FLOAT, 
841
                  requiredBytes>0?requiredBytes:DataType.DOUBLE_MAX_PRECISION+3, 
842
                  precision, scale
843
          );
850
          if( requiredBytes<1 ) {
851
            requiredBytes = DataType.DOUBLE_MAX_PRECISION+3;
852
          }
853
          if( requiredBytes>DbaseFieldDescriptor.MAX_NUMBER_SIZE ) {
854
            requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
855
          }
856
          header.addColumn(colName, DBFTYPE_FLOAT, requiredBytes, precision, scale);
844 857
          break;
845 858
        case DataTypes.FLOAT:
846
          header.addColumn(colName, DBFTYPE_FLOAT, 
847
                  requiredBytes>0?requiredBytes:DataType.FLOAT_MAX_PRECISION+3, 
848
                  precision, scale
849
          );
859
          if( requiredBytes<1 ) {
860
            requiredBytes = DataType.FLOAT_MAX_PRECISION+3;
861
          }
862
          if( requiredBytes>DbaseFieldDescriptor.MAX_NUMBER_SIZE ) {
863
            requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
864
          }
865
          header.addColumn(colName, DBFTYPE_FLOAT, requiredBytes, precision, scale);
850 866
          break;
851 867
        case DataTypes.INT:
852
          header.addColumn(colName, DBFTYPE_NUMBER, 
853
                  requiredBytes>0?requiredBytes:(precision>=DataType.INT_MAX_PRECISION?precision:precision+1), 
854
                  precision, scale
855
          );
868
          if( requiredBytes<1 ) {
869
            if( precision>=DataType.INT_MAX_PRECISION ) {
870
              requiredBytes = precision;
871
            } else {
872
              requiredBytes = precision + 1;
873
            }
874
          }
875
          if( requiredBytes>DbaseFieldDescriptor.MAX_NUMBER_SIZE ) {
876
            requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
877
          }
878
          header.addColumn(colName, DBFTYPE_NUMBER, requiredBytes, precision, scale);
856 879
          break;
857 880
        case DataTypes.LONG:
858
          header.addColumn(colName, DBFTYPE_NUMBER, 
859
                  requiredBytes>0?requiredBytes:(precision>=DataType.LONG_MAX_PRECISION?precision:precision+1), 
860
                  precision, scale
861
          );
881
          if( requiredBytes<1 ) {
882
            if( precision>=DataType.LONG_MAX_PRECISION ) {
883
              requiredBytes = precision;
884
            } else {
885
              requiredBytes = precision + 1;
886
            }
887
          }
888
          if( requiredBytes>DbaseFieldDescriptor.MAX_NUMBER_SIZE ) {
889
            requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
890
          }
891
          header.addColumn(colName, DBFTYPE_NUMBER, requiredBytes, precision, scale);
862 892
          break;
863 893
        case DataTypes.DATE:
864 894
          header.addColumn(colName, DBFTYPE_DATE, FieldFormatter.DATE_SIZE, 0, 0);
......
873 903
          header.addColumn(colName, DBFTYPE_BOOLEAN, 1, 0, 0);
874 904
          break;
875 905
        case DataTypes.STRING:
876
          header.addColumn(colName, DBFTYPE_STRING, Math.min(254, size), 0, 0);
906
          if( requiredBytes<1 ) {
907
            requiredBytes = size;
908
          }
909
          if( requiredBytes>DbaseFieldDescriptor.MAX_SIZE ) {
910
            requiredBytes = DbaseFieldDescriptor.MAX_SIZE;
911
          }
912
          header.addColumn(colName, DBFTYPE_STRING, requiredBytes, 0, 0);
877 913
          break;
878 914
        case DataTypes.BYTE:
879
          header.addColumn(colName, DBFTYPE_NUMBER, 
880
                  requiredBytes>0?requiredBytes:(precision>=DataType.BYTE_MAX_PRECISION?precision:precision+1), 
881
                  precision, scale
882
          );
915
          if( requiredBytes<1 ) {
916
            if( precision>=DataType.BYTE_MAX_PRECISION ) {
917
              requiredBytes = precision;
918
            } else {
919
              requiredBytes = precision + 1;
920
            }
921
          }
922
          if( requiredBytes>DbaseFieldDescriptor.MAX_NUMBER_SIZE ) {
923
            requiredBytes = DbaseFieldDescriptor.MAX_NUMBER_SIZE;
924
          }
925
          header.addColumn(colName, DBFTYPE_NUMBER,requiredBytes, precision, scale);
883 926
          break;
884 927
        default:
885 928
          // Si no sabemos lo que es intentaremos guardarlo como un string
886
          header.addColumn(colName, DBFTYPE_STRING, Math.min(254, size < 10 ? 10 : size), 0, 0);
929
          if( requiredBytes<1 ) {
930
            if( size < 20 ) {
931
              requiredBytes = 20;
932
            } else {
933
              requiredBytes = size;
934
            }
935
          }
936
          if( requiredBytes>DbaseFieldDescriptor.MAX_SIZE ) {
937
            requiredBytes = DbaseFieldDescriptor.MAX_SIZE;
938
          }
939
          header.addColumn(colName, DBFTYPE_STRING, requiredBytes, 0, 0);
887 940
          break;
888 941
      }
889

  
890 942
    }
891 943
    return header;
892 944
  }

Also available in: Unified diff